@gitlab/ui
Version:
GitLab UI Components
266 lines (255 loc) • 10.1 kB
JavaScript
import Fuse from 'fuse.js';
import GlBadge from '../components/base/badge/badge';
import GlButton from '../components/base/button/button';
import GlCollapsibleListbox from '../components/base/new_dropdowns/listbox/listbox';
import GlSearchBoxByType from '../components/base/search_box_by_type/search_box_by_type';
import GlLink from '../components/base/link/link';
import GlTable from '../components/base/table/table';
import GlPagination from '../components/base/pagination/pagination';
import { GlTooltipDirective } from '../directives/tooltip/tooltip';
import TOKENS_DEFAULT from './build/json/tokens.json';
import TOKENS_DARK from './build/json/tokens.dark.json';
import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
var script = {
name: 'TokensTable',
tokens: {
default: TOKENS_DEFAULT,
dark: TOKENS_DARK
},
components: {
GlBadge,
GlButton,
GlCollapsibleListbox,
GlSearchBoxByType,
GlLink,
GlTable,
GlPagination
},
directives: {
GlTooltip: GlTooltipDirective
},
fields: [{
key: 'description',
label: 'Description'
}, {
key: 'value',
label: 'Value'
}],
data() {
return {
filter: '',
platforms: [{
value: 'name',
text: 'Name'
}, {
value: 'figma',
text: 'Figma'
}, {
value: 'css',
text: 'CSS'
}, {
value: 'scss',
text: 'SCSS'
}],
modes: [{
value: 'default',
text: 'Default'
}, {
value: 'dark',
text: 'Dark'
}],
selectedPlatform: 'name',
selectedMode: 'default',
currentPage: 1,
perPage: 50,
totalFilteredItems: 0
};
},
watch: {
selectedPlatform: 'refresh',
selectedMode: 'refresh',
filter: 'resetCurrentPage'
},
methods: {
isColor(type) {
return type === 'color';
},
isAliasValue(value) {
return typeof value === 'string' && value.includes('{');
},
isAliasObject(value) {
return typeof value === 'object' && Object.values(value).some(val => this.isAliasValue(val));
},
getAliasValueName(value) {
if (this.isAliasValue(value)) {
return value.slice(1, -1);
}
return value;
},
getValueLabel(token) {
const value = token.original.$value;
if (this.isAliasObject(value)) {
return this.getAliasValueName(value[this.selectedMode]);
}
if (this.isAliasValue(value)) {
return this.getAliasValueName(value);
}
return token.$value;
},
transformTokenToTableColumns(token) {
return {
id: token.path.filter(Boolean).join('-'),
name: this.formatTokenName(this.selectedPlatform, token),
type: token.$type,
value: token.$value,
valueLabel: this.getValueLabel(token),
deprecated: token.deprecated ? 'deprecated' : '',
description: token.$description
};
},
filterItems(items, filter) {
if (!filter) return items;
const fuse = new Fuse(items, {
keys: Object.keys(items[0]),
includeScore: true
});
const results = fuse.search(filter);
return results.sort((a, b) => {
if (a.item.deprecated && !b.item.deprecated) return 1;
if (!a.item.deprecated && b.item.deprecated) return -1;
return a.score - b.score;
}).map(_ref => {
let {
item
} = _ref;
return item;
});
},
paginateItems(items, currentPage, perPage) {
const start = (currentPage - 1) * perPage;
return items.slice(start, start + perPage);
},
itemsProvider(_ref2) {
let {
currentPage,
perPage,
filter
} = _ref2;
try {
const items = this.transformTokensToTableRows(this.$options.tokens[this.selectedMode]);
const filteredItems = this.filterItems(items, filter);
this.totalFilteredItems = filteredItems.length;
const paginatedFilteredItems = this.paginateItems(filteredItems, currentPage, perPage);
return paginatedFilteredItems;
} catch (e) {
// eslint-disable-next-line no-console
console.error('Failed to provide items', e);
return [];
}
},
transformTokensToTableRows(tokens) {
const tokensArray = [];
Object.keys(tokens).forEach(key => {
const token = tokens[key];
if (token.$value) {
tokensArray.push(this.transformTokenToTableColumns(token));
} else {
tokensArray.push(...this.transformTokensToTableRows(token));
}
});
tokensArray
// Sort tokensArray by id
.sort((a, b) => {
if (a.id < b.id) {
return -1;
}
if (a.id > b.id) {
return 1;
}
return 0;
})
// Sort tokensArray so deprecated items are last
.sort((a, b) => {
if (a.deprecated && !b.deprecated) {
return 1;
}
if (!a.deprecated && b.deprecated) {
return -1;
}
return 0;
});
return tokensArray;
},
formatTokenName(format, token) {
let figmaPrefix = '';
const prefix = token.prefix === false ? '' : 'gl';
switch (format) {
case 'figma':
if (token.filePath.match('contextual')) {
figmaPrefix = '🔒/';
}
if (token.deprecated) {
figmaPrefix = '⚠️ DEPRECATED/';
}
return `${figmaPrefix}${token.path.filter(Boolean).join('-')}`;
case 'css':
return `var(--${[prefix, ...token.path].filter(Boolean).join('-')})`;
case 'scss':
return `$${[prefix, ...token.path].filter(Boolean).join('-')}`;
default:
return token.path.filter(Boolean).join('.');
}
},
getTokenName(token) {
return `$${token.prefix === false ? '' : 'gl-'}${token.path.filter(Boolean).join('-')}`;
},
copyToClipboard(value) {
navigator.clipboard.writeText(value);
},
resetCurrentPage() {
this.currentPage = 1;
},
refresh() {
this.$root.$emit('bv::refresh::table', 'tokens-table');
}
}
};
/* script */
const __vue_script__ = script;
/* template */
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('p',{staticClass:"gl-text-sm gl-text-subtle"},[_vm._v("\n For full token details, see\n "),_c('gl-link',{attrs:{"href":"https://gitlab.com/gitlab-org/gitlab-ui/-/tree/main/src/tokens/build/json","target":"_blank"}},[_vm._v("https://gitlab.com/gitlab-org/gitlab-ui/-/tree/main/src/tokens/build/json")])],1),_vm._v(" "),_c('div',{staticClass:"gl-mb-5 gl-flex gl-items-center gl-gap-3"},[_c('gl-search-box-by-type',{staticClass:"gl-grow",attrs:{"debounce":"250"},model:{value:(_vm.filter),callback:function ($$v) {_vm.filter=$$v;},expression:"filter"}}),_vm._v(" "),_c('gl-collapsible-listbox',{attrs:{"selected":_vm.selectedPlatform,"items":_vm.platforms},on:{"search":function($event){_vm.query = $event;}},model:{value:(_vm.selectedPlatform),callback:function ($$v) {_vm.selectedPlatform=$$v;},expression:"selectedPlatform"}}),_vm._v(" "),_c('gl-collapsible-listbox',{attrs:{"selected":_vm.selectedMode,"items":_vm.modes},on:{"search":function($event){_vm.query = $event;}},model:{value:(_vm.selectedMode),callback:function ($$v) {_vm.selectedMode=$$v;},expression:"selectedMode"}})],1),_vm._v(" "),_c('gl-table',{attrs:{"id":"tokens-table","filter":_vm.filter,"items":_vm.itemsProvider,"fields":_vm.$options.fields,"tbody-tr-attr":function (item) { return ({ id: item.id }); },"current-page":_vm.currentPage,"per-page":_vm.perPage,"hover":"","fixed":"","stacked":"sm"},scopedSlots:_vm._u([{key:"cell(description)",fn:function(ref){
var ref_item = ref.item;
var name = ref_item.name;
var deprecated = ref_item.deprecated;
var description = ref_item.description;
return [_c('code',{staticClass:"gl-text-base gl-text-strong"},[_vm._v("\n "+_vm._s(name)+"\n "),_c('gl-button',{directives:[{name:"gl-tooltip",rawName:"v-gl-tooltip"}],attrs:{"title":("Copy " + _vm.selectedPlatform + " value to clipboard"),"icon":"copy-to-clipboard","aria-label":("Copy " + _vm.selectedPlatform + " value to clipboard"),"size":"small"},on:{"click":function($event){return _vm.copyToClipboard(name)}}})],1),_vm._v(" "),(deprecated)?_c('gl-badge',{attrs:{"variant":"danger"}},[_vm._v("Deprecated")]):_vm._e(),_vm._v(" "),(description)?_c('div',{staticClass:"gl-mt-3 gl-text-subtle"},[_vm._v("\n "+_vm._s(description)+"\n ")]):_vm._e()]}},{key:"cell(value)",fn:function(ref){
var ref_item = ref.item;
var type = ref_item.type;
var value = ref_item.value;
var valueLabel = ref_item.valueLabel;
return [_c('div',{staticClass:"gl-flex gl-items-center gl-gap-3"},[(_vm.isColor(type))?_c('div',{staticClass:"gl-h-5 gl-w-5 gl-rounded-base",style:({ 'background-color': value })}):_vm._e(),_vm._v(" "),_c('code',{staticClass:"gl-min-w-0 gl-text-base gl-text-strong"},[_vm._v(_vm._s(valueLabel))])])]}}])}),_vm._v(" "),_c('gl-pagination',{attrs:{"align":"center","per-page":_vm.perPage,"total-items":_vm.totalFilteredItems},model:{value:(_vm.currentPage),callback:function ($$v) {_vm.currentPage=$$v;},expression:"currentPage"}})],1)};
var __vue_staticRenderFns__ = [];
/* style */
const __vue_inject_styles__ = undefined;
/* scoped */
const __vue_scope_id__ = undefined;
/* module identifier */
const __vue_module_identifier__ = undefined;
/* functional template */
const __vue_is_functional_template__ = false;
/* style inject */
/* style inject SSR */
/* style inject shadow dom */
const __vue_component__ = /*#__PURE__*/__vue_normalize__(
{ render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
__vue_inject_styles__,
__vue_script__,
__vue_scope_id__,
__vue_is_functional_template__,
__vue_module_identifier__,
false,
undefined,
undefined,
undefined
);
export { __vue_component__ as default };