UNPKG

@gitlab/ui

Version:
266 lines (255 loc) 10.1 kB
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 };