public/lib/column-defaults.js (411 lines of code) (raw):
import priorityTemplate from "components/content-list-item/templates/priority.html";
import contentTypeTemplate from "components/content-list-item/templates/content-type.html";
import titleTemplate from "components/content-list-item/templates/title.html";
import bylineTemplate from "components/content-list-item/templates/byline.html";
import commentsTemplate from "components/content-list-item/templates/comments.html";
import mainImageTemplate from "components/content-list-item/templates/main-image.html";
import incopyTemplate from "components/content-list-item/templates/incopy.html";
import optimisedForWebTemplate from "components/content-list-item/templates/optimisedForWeb.html";
import sensitiveTemplate from "components/content-list-item/templates/sensitive.html";
import legallySensitiveTemplate from "components/content-list-item/templates/legallySensitive.html";
import presenceTemplate from "components/content-list-item/templates/presence.html";
import assigneeTemplate from "components/content-list-item/templates/assignee.html";
import officeTemplate from "components/content-list-item/templates/office.html";
import deadlineTemplate from "components/content-list-item/templates/deadline.html";
import sectionTemplate from "components/content-list-item/templates/section.html";
import statusTemplate from "components/content-list-item/templates/status.html";
import notesTemplate from "components/content-list-item/templates/notes.html";
import pinboardTemplate from "components/content-list-item/templates/pinboard.html";
import linksTemplate from "components/content-list-item/templates/links.html";
import publishedStateTemplate from "components/content-list-item/templates/published-state.html";
import wordcountTemplate from "components/content-list-item/templates/wordcount.html";
import printWordcountTemplate from "components/content-list-item/templates/printwordcount.html";
import commissionedLengthTemplate from "components/content-list-item/templates/commissionedLength.html";
import needsLegalTemplate from "components/content-list-item/templates/needsLegal.html";
import lastModifiedTemplate from "components/content-list-item/templates/last-modified.html";
import lastModifiedByTemplate from "components/content-list-item/templates/last-modified-by.html";
import printLocationTemplate from "components/content-list-item/templates/printLocation.html";
import needsPictureDeskTemplate from "components/content-list-item/templates/needsPictureDesk.html";
import statusInPrintTemplate from "components/content-list-item/templates/statusInPrint.html";
import lastModifiedInPrintByTemplate from "components/content-list-item/templates/lastModifiedInPrintBy.html";
import contentRightsTemplate from "components/content-list-item/templates/rights.html";
/**
* This array represents the default ordering and display of the content-list-item columns for workflow.
* It will be used as default or overridden by an individual users preferences.
* @type {
* name: string, // the css classname / identifier of the field
* prettyName: '',
* labelHTML: string, // HTML, if any, to be used as the column heading contents
* colspan: number, // colspan of this field
* title: string, // title attribute contents for the column heading
* templateUrl: string // URL for the content-list-item template for this field
* isSortable: boolean = false // Can the column be sorted by clicking its header?
* sortField?: string[] // The field(s) to sort on, if different from `name`. Can be an item path, e.g. `a.nested.field`
* defaultSortOrder?: ['asc' | 'desc'] // The default sort order for the column on first click. Defaults to 'asc'
* flipSortIconDirection: boolean = false // Flip the direction of the sort chevron relative to the sort order. Defaults to 'desc' -> ▼
* }
*/
var templateRoot = '/assets/components/content-list-item/templates/';
const chevronUp = '▼'
const chevronDown = '▲'
const createSortTemplate = (colName, sortField, labelHTML, flipSortIconDirection = false) => {
// For some field types, the semantics of 'up' or 'down' differ; we use
// flipSortIconDirection to switch them when needed.
const descChevron = flipSortIconDirection ? chevronDown : chevronUp;
const ascChevron = flipSortIconDirection ? chevronUp : chevronDown;
return `
<div ng-click="toggleSortState('${colName}', [${sortField.map(field => `'${field}'`).join()}])" class="content-list-head__heading-sort-by">
${labelHTML}
<span
class="content-list-head__heading-sort-indicator"
ng-class="{invisible: !getSortDirection('${colName}')}"
ng-switch="getSortDirection('${colName}')">
<span ng-switch-when="desc">${descChevron}</span>
<span ng-switch-when="asc">${ascChevron}</span>
<!-- We add a character here and use ng-visible above to prevent -->
<!-- sort state from interfering with table header spacing -->
<span ng-switch-default>▲</span>
</span>
</div>
`;
};
const createCustomHeadlineLabelHtml = () => {
return `
<i ng-click="toggleHeadlineDisplay(); $event.stopPropagation()"
title="Click to toggle Headlines"
class="content-list-head__heading-icon--headline-toggle" wf-icon="{{ getHeadlineDisplay()? 'toggle-right': 'toggle-left' }}"/>
<span ng-class="{'content-list-head__heading--titles--secondary': getHeadlineDisplay()}">Working title</span> / <span ng-class="{ 'content-list-head__heading--titles--secondary': !getHeadlineDisplay()}">Headline</span>
`;
};
export const getSortField = column => column
&& column.isSortable
&& (column.sortField || [column.name]);
const columnDefaults = [{
name: 'priority',
prettyName: 'Priority',
labelHTML: '<i class="content-list-item__icon--priority" wf-icon="priority-neutral" />',
colspan: 1,
title: '',
templateUrl: templateRoot + 'priority.html',
template: priorityTemplate,
active: true,
alwaysShown: true,
isSortable: true,
defaultSortOrder: ['desc', 'asc'],
flipSortIconDirection: true,
sortField: ['prioritySortValue', 'workingTitle']
},{
name: 'content-type',
prettyName: 'Content Type',
labelHTML: '',
colspan: 1,
title: '',
templateUrl: templateRoot + 'content-type.html',
template: contentTypeTemplate,
active: true
},{
name: 'titles',
prettyName: 'Working title / Headline',
labelHTML: createCustomHeadlineLabelHtml(),
colspan: 1,
title: '',
templateUrl: templateRoot + 'title.html',
template: titleTemplate,
active: true,
alwaysShown: true,
isSortable: true,
sortField: ['workingTitle']
},{
name: 'byline',
prettyName: 'Byline',
labelHTML: 'Byline',
colspan: 1,
title: '',
templateUrl: templateRoot + 'byline.html',
template: bylineTemplate,
active: false,
isNew: false,
sortField: ['byline']
},{
name: 'notes',
prettyName: 'Notes',
labelHTML: 'Notes',
colspan: 1,
title: '',
templateUrl: templateRoot + 'notes.html',
template: notesTemplate,
active: true,
isSortable: true,
sortField: ['note']
},{
name: 'rights',
prettyName: 'Syndication',
labelHTML: 'Syndication',
colspan: 1,
title: '',
template: contentRightsTemplate,
active: false,
isNew: false,
isSortable: true,
sortField: ['rightsSyndicationAggregate', 'rightsSubscriptionDatabases', 'rightsDeveloperCommunity']
},{
name: 'pinboard',
prettyName: 'Pinboard 📌',
labelHTML: '',
colspan: 1,
title: '',
templateUrl: templateRoot + 'pinboard.html',
template: pinboardTemplate,
active: false,
isSortable: false,
isNew: true
},{
name: 'comments',
prettyName: 'Comments: On/Off',
labelHTML: '',
colspan: 1,
title: '',
templateUrl: templateRoot + 'comments.html',
template: commentsTemplate,
active: true
},{
name: 'main-image',
prettyName: 'Main Image',
labelHTML: '',
colspan: 1,
title: '',
templateUrl: templateRoot + 'main-image.html',
template: mainImageTemplate,
active: true
},{
name: 'incopy',
prettyName: 'InCopy',
labelHTML: '',
colspan: 1,
title: '',
templateUrl: templateRoot + 'incopy.html',
template: incopyTemplate,
active: true
},{
name: 'optimisedForWeb',
prettyName: 'Optimised For Web',
labelHTML: '',
colspan: 1,
title: '',
templateUrl: templateRoot + 'optimisedForWeb.html',
template: optimisedForWebTemplate,
active: true,
isNew: false
},{
name: 'sensitive',
prettyName: 'Sensitive',
labelHTML: '',
colspan: 1,
title: '',
templateUrl: templateRoot + 'sensitive.html',
template: sensitiveTemplate,
active: false
},{
name: 'legallySensitive',
prettyName: 'Legally sensitive',
labelHTML: '',
colspan: 1,
title: '',
templateUrl: templateRoot + 'legallySensitive.html',
template: legallySensitiveTemplate,
active: false
},{
name: 'needsLegal',
prettyName: 'Needs Legal',
labelHTML: '',
colspan: 1,
title: 'Needs Legal',
templateUrl: templateRoot + 'needsLegal.html',
template: needsLegalTemplate,
active: true,
isSortable: true,
flipSortIconDirection: true,
defaultSortOrder: ['desc']
},{
name: 'needs-picture-desk',
prettyName: 'Needs Picture Desk',
labelHTML: '',
colspan: 1,
title: 'Needs Picture Desk',
templateUrl: templateRoot + 'needsPictureDesk.html',
template: needsPictureDeskTemplate,
active: true,
isNew: true,
isSortable: true,
defaultSortOrder: ['desc'],
flipSortIconDirection: true,
sortField: ['needsPictureDesk']
},{
name: 'presence',
prettyName: 'Presence',
labelHTML: '<div ng-switch="presenceIsActive"><i class="content-list-head__heading-icon--presence" ng-switch-when="false" wf-icon="presence-unavailable"/><i class="content-list-head__heading-icon--presence" ng-switch-default wf-icon="presence"/></div>',
colspan: 1,
title: 'In use by',
unavailableTitle: 'Presence is currently unavailable, reloading your browser might fix this.',
templateUrl: templateRoot + 'presence.html',
template: presenceTemplate,
active: true
},{
name: 'assignee',
prettyName: 'Assignee',
labelHTML: '<i class="content-list-head__heading-icon--assignee" wf-icon="assigned-to"/>',
colspan: 1,
title: 'Assigned to',
templateUrl: templateRoot + 'assignee.html',
template: assigneeTemplate,
active: true
},{
name: 'office',
prettyName: 'Office',
labelHTML: 'Office',
colspan: 1,
title: '',
templateUrl: templateRoot + 'office.html',
template: officeTemplate,
active: true,
isSortable: true
},{
name: 'deadline',
prettyName: 'Deadline',
labelHTML: 'Deadline',
colspan: 1,
title: '',
templateUrl: templateRoot + 'deadline.html',
template: deadlineTemplate,
active: true,
isSortable: true,
defaultSortOrder: ['desc']
},{
name: 'section',
prettyName: 'Section',
labelHTML: 'Section',
colspan: 1,
title: '',
templateUrl: templateRoot + 'section.html',
template: sectionTemplate,
active: true,
isSortable: true,
sortField: ['item.section'],
},{
name: 'status',
prettyName: 'Status',
labelHTML: 'Status',
colspan: 1,
title: '',
templateUrl: templateRoot + 'status.html',
template: statusTemplate,
active: true
},{
name: 'status-in-print',
prettyName: 'Status in Print',
labelHTML: 'Status in Print',
colspan: 1,
title: '',
templateUrl: templateRoot + 'statusInPrint.html',
template: statusInPrintTemplate,
active: true,
isNew: true,
isSortable: true,
sortField: ['statusInPrint']
},{
name: 'commissionedLength',
prettyName: 'Commissioned Length',
labelHTML: 'Commissioned Length',
colspan: 1,
title: '',
templateUrl: templateRoot + 'commissionedLength.html',
template: commissionedLengthTemplate,
active: true,
isSortable: true,
sortField: ['missingCommissionedLengthReason', 'commissionedLength']
},{
name: 'wordcount',
prettyName: 'Web wordcount',
labelHTML: 'Web words',
colspan: 1,
title: '',
templateUrl: templateRoot + 'wordcount.html',
template: wordcountTemplate,
active: true,
isSortable: true,
sortField: ['wordCount']
},{
name: 'printwordcount',
prettyName: 'Print wordcount',
labelHTML: 'Print words',
colspan: 1,
title: '',
templateUrl: templateRoot + 'printwordcount.html',
template: printWordcountTemplate,
active: true,
isNew: true,
isSortable: true,
sortField: ['printWordCount']
},{
name: 'printlocation',
prettyName: 'Print location',
labelHTML: 'Print location',
colspan: 1,
title: '',
templateUrl: templateRoot + 'printLocation.html',
template: printLocationTemplate,
active: true,
isNew: true,
isSortable: true,
defaultSortOrder: ['asc', 'desc', 'asc'],
sortField: ['printLocationBookSection', 'printLocationPublicationDate', 'printLocationPageNumber']
},{
name: 'links',
prettyName: 'Open in...',
labelHTML: 'Open in',
colspan: 4,
title: '',
templateUrl: templateRoot + 'links.html',
template: linksTemplate,
active: true
},{
name: 'published-state',
prettyName: 'Published State',
labelHTML: 'State',
colspan: 1,
title: '',
templateUrl: templateRoot + 'published-state.html',
template: publishedStateTemplate,
active: true,
isSortable: true,
defaultSortOrder: ['asc', 'desc'],
sortField: ['lifecycleState', 'lifecycleStateSuplDate']
},{
name: 'last-modified',
prettyName: 'Last modified',
labelHTML: 'Last modified',
colspan: 1,
title: '',
templateUrl: templateRoot + 'last-modified.html',
template: lastModifiedTemplate,
active: true,
isNew: true,
isSortable: true,
sortField: ['lastModified'],
defaultSortOrder: ['desc']
},{
name: 'last-modified-by',
prettyName: 'Last user',
labelHTML: 'Last user',
colspan: 1,
title: '',
templateUrl: templateRoot + 'last-modified-by.html',
template: lastModifiedByTemplate,
active: true,
isNew: true,
isSortable: true,
sortField: ['lastModifiedBy']
},{
name: 'last-modified-in-print-by',
prettyName: 'Last print user',
labelHTML: 'Last print user',
colspan: 1,
title: '',
templateUrl: templateRoot + 'lastModifiedInPrintBy.html',
template: lastModifiedInPrintByTemplate,
active: true,
isNew: true,
isSortable: true,
sortField: ['lastModifiedInPrintBy']
}].map(col => {
const _labelHTML = col.labelHTML === ''
? ' '
: col.labelHTML;
const labelHTML = col.isSortable
? createSortTemplate(col.name, getSortField(col), _labelHTML, col.flipSortIconDirection)
: _labelHTML;
return {...col, active: true, labelHTML};
});
export { columnDefaults }