@contentful/field-editor-slug 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/cjs/SlugEditor.js +139 -0
  2. package/dist/cjs/SlugEditor.test.js +508 -0
  3. package/dist/cjs/SlugEditorField.js +186 -0
  4. package/dist/cjs/TrackingFieldConnector.js +137 -0
  5. package/dist/cjs/index.js +24 -0
  6. package/dist/cjs/services/makeSlug.js +42 -0
  7. package/dist/cjs/services/makeSlug.test.js +14 -0
  8. package/dist/cjs/services/slugify.js +64 -0
  9. package/dist/cjs/services/slugify.test.js +30 -0
  10. package/dist/cjs/styles.js +68 -0
  11. package/dist/esm/SlugEditor.js +90 -0
  12. package/dist/esm/SlugEditor.test.js +460 -0
  13. package/dist/esm/SlugEditorField.js +129 -0
  14. package/dist/esm/TrackingFieldConnector.js +88 -0
  15. package/dist/esm/index.js +3 -0
  16. package/dist/esm/services/makeSlug.js +24 -0
  17. package/dist/esm/services/makeSlug.test.js +10 -0
  18. package/dist/esm/services/slugify.js +49 -0
  19. package/dist/esm/services/slugify.test.js +26 -0
  20. package/dist/esm/styles.js +33 -0
  21. package/dist/{SlugEditor.d.ts → types/SlugEditor.d.ts} +24 -24
  22. package/dist/types/SlugEditor.test.d.ts +1 -0
  23. package/dist/{SlugEditorField.d.ts → types/SlugEditorField.d.ts} +18 -18
  24. package/dist/{TrackingFieldConnector.d.ts → types/TrackingFieldConnector.d.ts} +29 -29
  25. package/dist/{index.d.ts → types/index.d.ts} +3 -3
  26. package/dist/{services → types/services}/makeSlug.d.ts +8 -8
  27. package/dist/types/services/makeSlug.test.d.ts +1 -0
  28. package/dist/{services → types/services}/slugify.d.ts +12 -12
  29. package/dist/types/services/slugify.test.d.ts +1 -0
  30. package/dist/{styles.d.ts → types/styles.d.ts} +6 -6
  31. package/package.json +25 -11
  32. package/CHANGELOG.md +0 -206
  33. package/dist/field-editor-slug.cjs.development.js +0 -463
  34. package/dist/field-editor-slug.cjs.development.js.map +0 -1
  35. package/dist/field-editor-slug.cjs.production.min.js +0 -2
  36. package/dist/field-editor-slug.cjs.production.min.js.map +0 -1
  37. package/dist/field-editor-slug.esm.js +0 -454
  38. package/dist/field-editor-slug.esm.js.map +0 -1
  39. package/dist/index.js +0 -8
@@ -1,454 +0,0 @@
1
- import React__default, { useCallback, createElement } from 'react';
2
- import { FieldConnector } from '@contentful/field-editor-shared';
3
- import { TextInput, Spinner, ValidationMessage } from '@contentful/f36-components';
4
- import { LinkIcon } from '@contentful/f36-icons';
5
- import { useDebounce } from 'use-debounce';
6
- import getSlug from 'speakingurl';
7
- import tokens from '@contentful/f36-tokens';
8
- import { css } from 'emotion';
9
-
10
- const CF_GENERATED_SLUG_MAX_LENGTH = 75;
11
- const languages = ['ar', 'az', 'cs', 'de', 'dv', 'en', 'es', 'fa', 'fi', 'fr', 'ge', 'gr', 'hu', 'it', 'lt', 'lv', 'my', 'mk', 'nl', 'pl', 'pt', 'ro', 'ru', 'sk', 'sr', 'tr', 'uk', 'vn'];
12
- /**
13
- * Extracts the first two lowercased characters from the locale,
14
- * and returns the supported language prefix.
15
- */
16
-
17
- function supportedLanguage(locale) {
18
- const prefix = locale.slice(0, 2).toLowerCase();
19
- return languages[languages.indexOf(prefix)];
20
- }
21
- /**
22
- * Returns the slug for a given string and locale.
23
- * If the locale belongs to a language supported by SpeakingURL, it
24
- * is used as the symbol language. Otherwise, the symbol language
25
- * is english.
26
- * Slug suggestions are limited to 75 characters.
27
- *
28
- * @param {string} text To be turned into a slug.
29
- * @param {string?} locale
30
- * @returns {string} Slug for provided text.
31
- */
32
-
33
-
34
- function slugify(text, locale = 'en') {
35
- return getSlug(text, {
36
- separator: '-',
37
- lang: supportedLanguage(locale) || 'en',
38
- truncate: CF_GENERATED_SLUG_MAX_LENGTH + 1,
39
- custom: {
40
- "'": '',
41
- '`': '',
42
- '’': '',
43
- '‘': ''
44
- }
45
- });
46
- }
47
-
48
- function formatTwoDigit(num) {
49
- const asString = String(num);
50
- return asString.length === 1 ? `0${asString}` : asString;
51
- }
52
-
53
- function formatUtcDate(date) {
54
- const year = date.getFullYear();
55
- const month = formatTwoDigit(date.getUTCMonth() + 1);
56
- const day = formatTwoDigit(date.getUTCDate());
57
- const hour = formatTwoDigit(date.getUTCHours());
58
- const minutes = formatTwoDigit(date.getUTCMinutes());
59
- const seconds = formatTwoDigit(date.getUTCSeconds());
60
- return `${year} ${month} ${day} at ${hour} ${minutes} ${seconds}`;
61
- }
62
-
63
- function untitledSlug({
64
- isOptionalLocaleWithFallback,
65
- createdAt
66
- }) {
67
- if (isOptionalLocaleWithFallback) {
68
- return ''; // Will result in `undefined` slug.
69
- }
70
-
71
- const createdAtFormatted = formatUtcDate(new Date(createdAt));
72
- return slugify('Untitled entry ' + createdAtFormatted, 'en-US');
73
- }
74
-
75
- function makeSlug(title, options) {
76
- return title ? slugify(title, options.locale) : untitledSlug(options);
77
- }
78
-
79
- const inputContainer = /*#__PURE__*/css({
80
- position: 'relative'
81
- });
82
- const input = /*#__PURE__*/css({
83
- paddingLeft: '40px'
84
- });
85
- const icon = /*#__PURE__*/css({
86
- position: 'absolute',
87
- left: '10px',
88
- top: '8px',
89
- zIndex: 2,
90
- width: '25px',
91
- height: '25px',
92
- fill: tokens.gray500
93
- });
94
- const spinnerContainer = /*#__PURE__*/css({
95
- position: 'absolute',
96
- zIndex: 2,
97
- right: '8px',
98
- top: '8px'
99
- });
100
- const uniqueValidationError = /*#__PURE__*/css({
101
- marginTop: tokens.spacingS
102
- });
103
-
104
- function useSlugUpdater(props, check) {
105
- const {
106
- value,
107
- setValue,
108
- createdAt,
109
- locale,
110
- titleValue,
111
- isOptionalLocaleWithFallback
112
- } = props;
113
- React__default.useEffect(() => {
114
- if (check === false) {
115
- return;
116
- }
117
-
118
- const newSlug = makeSlug(titleValue, {
119
- isOptionalLocaleWithFallback,
120
- locale,
121
- createdAt
122
- });
123
-
124
- if (newSlug !== value) {
125
- setValue(newSlug);
126
- }
127
- }, [value, titleValue, isOptionalLocaleWithFallback, check, createdAt, locale, setValue]);
128
- }
129
-
130
- function useUniqueChecker(props) {
131
- const {
132
- performUniqueCheck
133
- } = props;
134
- const [status, setStatus] = React__default.useState(props.value ? 'checking' : 'unique');
135
- const [debouncedValue] = useDebounce(props.value, 1000);
136
- /**
137
- * Check the uniqueness of the slug in the current space.
138
- * The slug is unique if there is no published entry other than the
139
- * current one, with the same slug.
140
- */
141
-
142
- React__default.useEffect(() => {
143
- if (!debouncedValue) {
144
- setStatus('unique');
145
- return;
146
- }
147
-
148
- setStatus('checking');
149
- performUniqueCheck(debouncedValue).then(unique => {
150
- setStatus(unique ? 'unique' : 'duplicate');
151
- }).catch(() => {
152
- setStatus('checking');
153
- });
154
- }, [debouncedValue, performUniqueCheck]);
155
- return status;
156
- }
157
-
158
- function SlugEditorFieldStatic(props) {
159
- const {
160
- hasError,
161
- isDisabled,
162
- value,
163
- setValue,
164
- onChange,
165
- onBlur
166
- } = props;
167
- const status = useUniqueChecker(props);
168
- return React__default.createElement("div", {
169
- className: inputContainer
170
- }, React__default.createElement(LinkIcon, {
171
- className: icon
172
- }), React__default.createElement(TextInput, {
173
- className: input,
174
- isInvalid: hasError || status === 'duplicate',
175
- isDisabled: isDisabled,
176
- value: value || '',
177
- onChange: e => {
178
- setValue(e.target.value);
179
-
180
- if (onChange) {
181
- onChange();
182
- }
183
- },
184
- onBlur: () => {
185
- if (onBlur) {
186
- onBlur();
187
- }
188
- }
189
- }), status === 'checking' && React__default.createElement("div", {
190
- className: spinnerContainer
191
- }, React__default.createElement(Spinner, {
192
- testId: "slug-editor-spinner"
193
- })), status === 'duplicate' && React__default.createElement(ValidationMessage, {
194
- testId: "slug-editor-duplicate-error",
195
- className: uniqueValidationError
196
- }, "This slug has already been published in another entry"));
197
- }
198
- function SlugEditorField(props) {
199
- const {
200
- titleValue,
201
- isOptionalLocaleWithFallback,
202
- locale,
203
- createdAt,
204
- value
205
- } = props;
206
- const areEqual = React__default.useCallback(() => {
207
- const potentialSlug = makeSlug(titleValue, {
208
- isOptionalLocaleWithFallback: isOptionalLocaleWithFallback,
209
- locale: locale,
210
- createdAt: createdAt
211
- });
212
- return value === potentialSlug;
213
- }, [titleValue, isOptionalLocaleWithFallback, locale, createdAt, value]);
214
- const [check, setCheck] = React__default.useState(() => {
215
- if (props.value) {
216
- if (!props.titleValue) {
217
- return false;
218
- }
219
-
220
- return areEqual();
221
- }
222
-
223
- return true;
224
- });
225
- React__default.useEffect(() => {
226
- if (areEqual()) {
227
- setCheck(true);
228
- }
229
- }, [props.titleValue, areEqual]);
230
- useSlugUpdater(props, check);
231
- return React__default.createElement(SlugEditorFieldStatic, { ...props,
232
- onChange: () => {
233
- setCheck(false);
234
- },
235
- onBlur: () => {
236
- if (areEqual()) {
237
- setCheck(true);
238
- }
239
- }
240
- });
241
- }
242
-
243
- function getTitleField(sdk, trackingFieldId) {
244
- const {
245
- entry,
246
- contentType
247
- } = sdk;
248
-
249
- if (trackingFieldId && entry.fields[trackingFieldId]) {
250
- return entry.fields[trackingFieldId];
251
- }
252
-
253
- return entry.fields[contentType.displayField];
254
- }
255
-
256
- class TrackingFieldConnector extends React__default.Component {
257
- constructor(props) {
258
- super(props);
259
- this.unsubscribeValue = null;
260
- this.unsubscribeLocalizedValue = null;
261
- this.unsubscribeSysChanges = null;
262
- const titleField = getTitleField(props.sdk, props.trackingFieldId);
263
- const entrySys = props.sdk.entry.getSys();
264
- const isSame = titleField ? props.field.id === titleField.id : false;
265
- this.state = {
266
- titleValue: titleField ? titleField.getValue() : '',
267
- isPublished: Boolean(entrySys.publishedVersion),
268
- isSame
269
- };
270
- }
271
-
272
- componentDidMount() {
273
- this.unsubscribeSysChanges = this.props.sdk.entry.onSysChanged(sys => {
274
- this.setState({
275
- isPublished: Boolean(sys.publishedVersion)
276
- });
277
- });
278
- const titleField = getTitleField(this.props.sdk, this.props.trackingFieldId); // the content type's display field might not exist
279
-
280
- if (!titleField) {
281
- return;
282
- }
283
-
284
- if (!this.state.isSame) {
285
- this.unsubscribeLocalizedValue = titleField.onValueChanged(this.props.field.locale, value => {
286
- this.setState({
287
- titleValue: value
288
- });
289
- });
290
- }
291
-
292
- if (this.props.field.locale !== this.props.defaultLocale) {
293
- if (!this.props.isOptionalLocaleWithFallback) {
294
- this.unsubscribeValue = titleField.onValueChanged(this.props.defaultLocale, value => {
295
- if (!titleField.getValue(this.props.field.locale)) {
296
- this.setState({
297
- titleValue: value
298
- });
299
- }
300
- });
301
- }
302
- }
303
- }
304
-
305
- componentWillUnmount() {
306
- if (typeof this.unsubscribeValue === 'function') {
307
- this.unsubscribeValue();
308
- }
309
-
310
- if (typeof this.unsubscribeLocalizedValue === 'function') {
311
- this.unsubscribeLocalizedValue();
312
- }
313
-
314
- if (typeof this.unsubscribeSysChanges === 'function') {
315
- this.unsubscribeSysChanges();
316
- }
317
- }
318
-
319
- render() {
320
- return this.props.children({ ...this.state
321
- });
322
- }
323
-
324
- }
325
- TrackingFieldConnector.defaultProps = {
326
- children: () => {
327
- return null;
328
- }
329
- };
330
-
331
- function isSupportedFieldTypes(val) {
332
- return val === 'Symbol';
333
- }
334
-
335
- function FieldConnectorCallback({
336
- Component,
337
- value,
338
- disabled,
339
- setValue,
340
- errors,
341
- titleValue,
342
- isOptionalLocaleWithFallback,
343
- locale,
344
- createdAt,
345
- performUniqueCheck
346
- }) {
347
- // it is needed to silent permission errors
348
- // this happens when setValue is called on a field which is disabled for permission reasons
349
- const safeSetValue = useCallback(async (...args) => {
350
- try {
351
- await setValue(...args);
352
- } catch (e) {// do nothing
353
- }
354
- }, [setValue]);
355
- return createElement("div", {
356
- "data-test-id": "slug-editor"
357
- }, createElement(Component, {
358
- locale: locale,
359
- createdAt: createdAt,
360
- performUniqueCheck: performUniqueCheck,
361
- hasError: errors.length > 0,
362
- value: value,
363
- isOptionalLocaleWithFallback: isOptionalLocaleWithFallback,
364
- isDisabled: disabled,
365
- titleValue: titleValue,
366
- setValue: safeSetValue
367
- }));
368
- }
369
-
370
- function SlugEditor(props) {
371
- var _parameters$instance, _entrySys$contentType3, _entrySys$contentType4;
372
-
373
- const {
374
- field,
375
- parameters
376
- } = props;
377
- const {
378
- locales,
379
- entry,
380
- space
381
- } = props.baseSdk;
382
-
383
- if (!isSupportedFieldTypes(field.type)) {
384
- throw new Error(`"${field.type}" field type is not supported by SlugEditor`);
385
- }
386
-
387
- const trackingFieldId = (parameters == null ? void 0 : (_parameters$instance = parameters.instance) == null ? void 0 : _parameters$instance.trackingFieldId) ?? undefined;
388
- const entrySys = entry.getSys();
389
- const isLocaleOptional = locales.optional[field.locale];
390
- const localeFallbackCode = locales.fallbacks[field.locale]; // If the field or the locale are not required (there's a locale setting that
391
- // allows publishing even if the field is required) and if the locale has a
392
- // fallback than there's no need for a slug unless the user manually enters
393
- // one or the title field is also localized with a custom value.
394
-
395
- const isOptionalFieldLocale = Boolean(!field.required || isLocaleOptional);
396
- const isOptionalLocaleWithFallback = Boolean(isOptionalFieldLocale && localeFallbackCode && locales.available.includes(localeFallbackCode));
397
- const performUniqueCheck = useCallback(value => {
398
- var _entrySys$contentType, _entrySys$contentType2;
399
-
400
- const searchQuery = {
401
- content_type: entrySys == null ? void 0 : (_entrySys$contentType = entrySys.contentType) == null ? void 0 : (_entrySys$contentType2 = _entrySys$contentType.sys) == null ? void 0 : _entrySys$contentType2.id,
402
- [`fields.${field.id}.${field.locale}`]: value,
403
- 'sys.id[ne]': entrySys.id,
404
- 'sys.publishedAt[exists]': true,
405
- limit: 0
406
- };
407
- return space.getEntries(searchQuery).then(res => {
408
- return res.total === 0;
409
- });
410
- }, [entrySys == null ? void 0 : (_entrySys$contentType3 = entrySys.contentType) == null ? void 0 : (_entrySys$contentType4 = _entrySys$contentType3.sys) == null ? void 0 : _entrySys$contentType4.id, field.id, field.locale, entrySys.id, space]);
411
- return createElement(TrackingFieldConnector, {
412
- sdk: props.baseSdk,
413
- field: field,
414
- defaultLocale: locales.default,
415
- isOptionalLocaleWithFallback: isOptionalLocaleWithFallback,
416
- trackingFieldId: trackingFieldId
417
- }, ({
418
- titleValue,
419
- isPublished,
420
- isSame
421
- }) => createElement(FieldConnector, {
422
- field: field,
423
- isInitiallyDisabled: props.isInitiallyDisabled,
424
- throttle: 0
425
- }, ({
426
- value,
427
- errors,
428
- disabled,
429
- setValue,
430
- externalReset
431
- }) => {
432
- const shouldTrackTitle = isPublished === false && isSame === false;
433
- const Component = shouldTrackTitle ? SlugEditorField : SlugEditorFieldStatic;
434
- return createElement(FieldConnectorCallback, {
435
- Component: Component,
436
- titleValue: titleValue,
437
- value: value,
438
- errors: errors,
439
- disabled: disabled,
440
- setValue: setValue,
441
- isOptionalLocaleWithFallback: isOptionalLocaleWithFallback,
442
- createdAt: entrySys.createdAt,
443
- locale: field.locale,
444
- performUniqueCheck: performUniqueCheck,
445
- key: `slug-editor-${externalReset}`
446
- });
447
- }));
448
- }
449
- SlugEditor.defaultProps = {
450
- isInitiallyDisabled: true
451
- };
452
-
453
- export { SlugEditor, makeSlug, slugify };
454
- //# sourceMappingURL=field-editor-slug.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-editor-slug.esm.js","sources":["../src/services/slugify.ts","../src/services/makeSlug.ts","../src/styles.ts","../src/SlugEditorField.tsx","../src/TrackingFieldConnector.tsx","../src/SlugEditor.tsx"],"sourcesContent":["import getSlug from 'speakingurl';\n\nconst CF_GENERATED_SLUG_MAX_LENGTH = 75;\n\nconst languages = [\n 'ar',\n 'az',\n 'cs',\n 'de',\n 'dv',\n 'en',\n 'es',\n 'fa',\n 'fi',\n 'fr',\n 'ge',\n 'gr',\n 'hu',\n 'it',\n 'lt',\n 'lv',\n 'my',\n 'mk',\n 'nl',\n 'pl',\n 'pt',\n 'ro',\n 'ru',\n 'sk',\n 'sr',\n 'tr',\n 'uk',\n 'vn',\n];\n\n/**\n * Extracts the first two lowercased characters from the locale,\n * and returns the supported language prefix.\n */\nfunction supportedLanguage(locale: string) {\n const prefix = locale.slice(0, 2).toLowerCase();\n return languages[languages.indexOf(prefix)];\n}\n\n/**\n * Returns the slug for a given string and locale.\n * If the locale belongs to a language supported by SpeakingURL, it\n * is used as the symbol language. Otherwise, the symbol language\n * is english.\n * Slug suggestions are limited to 75 characters.\n *\n * @param {string} text To be turned into a slug.\n * @param {string?} locale\n * @returns {string} Slug for provided text.\n */\nexport function slugify(text: string, locale = 'en') {\n return getSlug(text, {\n separator: '-',\n lang: supportedLanguage(locale) || 'en',\n truncate: CF_GENERATED_SLUG_MAX_LENGTH + 1,\n custom: {\n \"'\": '',\n '`': '',\n '’': '',\n '‘': '',\n },\n });\n}\n","import { slugify } from './slugify';\n\ntype MakeSlugOptions = {\n locale: string;\n isOptionalLocaleWithFallback: boolean;\n createdAt: string;\n};\n\nfunction formatTwoDigit(num: number) {\n const asString = String(num);\n return asString.length === 1 ? `0${asString}` : asString;\n}\n\nexport function formatUtcDate(date: Date) {\n const year = date.getFullYear();\n const month = formatTwoDigit(date.getUTCMonth() + 1);\n const day = formatTwoDigit(date.getUTCDate());\n const hour = formatTwoDigit(date.getUTCHours());\n const minutes = formatTwoDigit(date.getUTCMinutes());\n const seconds = formatTwoDigit(date.getUTCSeconds());\n\n return `${year} ${month} ${day} at ${hour} ${minutes} ${seconds}`;\n}\n\nfunction untitledSlug({ isOptionalLocaleWithFallback, createdAt }: MakeSlugOptions) {\n if (isOptionalLocaleWithFallback) {\n return ''; // Will result in `undefined` slug.\n }\n\n const createdAtFormatted = formatUtcDate(new Date(createdAt));\n return slugify('Untitled entry ' + createdAtFormatted, 'en-US');\n}\n\nexport function makeSlug(title: string | null | undefined, options: MakeSlugOptions) {\n return title ? slugify(title, options.locale) : untitledSlug(options);\n}\n","import tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nexport const validationRow = css({\n display: 'flex',\n flexDirection: 'row-reverse',\n fontSize: tokens.fontSizeM,\n marginTop: tokens.spacingXs,\n color: tokens.gray700,\n});\n\nexport const inputContainer = css({\n position: 'relative',\n});\n\nexport const input = css({\n paddingLeft: '40px',\n});\n\nexport const icon = css({\n position: 'absolute',\n left: '10px',\n top: '8px',\n zIndex: 2,\n width: '25px',\n height: '25px',\n fill: tokens.gray500,\n});\n\nexport const spinnerContainer = css({\n position: 'absolute',\n zIndex: 2,\n right: '8px',\n top: '8px',\n});\n\nexport const uniqueValidationError = css({\n marginTop: tokens.spacingS,\n});\n","import React from 'react';\n\nimport { Spinner, ValidationMessage, TextInput } from '@contentful/f36-components';\nimport { LinkIcon } from '@contentful/f36-icons';\nimport { useDebounce } from 'use-debounce';\n\nimport { makeSlug } from './services/makeSlug';\nimport * as styles from './styles';\n\n\n\ninterface SlugEditorFieldProps {\n hasError: boolean;\n isOptionalLocaleWithFallback: boolean;\n isDisabled: boolean;\n value: string | null | undefined;\n locale: string;\n titleValue: string | null | undefined;\n createdAt: string;\n setValue: (value: string | null | undefined) => void;\n performUniqueCheck: (value: string) => Promise<boolean>;\n}\n\ntype CheckerState = 'checking' | 'unique' | 'duplicate';\n\nfunction useSlugUpdater(props: SlugEditorFieldProps, check: boolean) {\n const { value, setValue, createdAt, locale, titleValue, isOptionalLocaleWithFallback } = props;\n\n React.useEffect(() => {\n if (check === false) {\n return;\n }\n const newSlug = makeSlug(titleValue, {\n isOptionalLocaleWithFallback,\n locale,\n createdAt,\n });\n if (newSlug !== value) {\n setValue(newSlug);\n }\n }, [value, titleValue, isOptionalLocaleWithFallback, check, createdAt, locale, setValue]);\n}\n\nfunction useUniqueChecker(props: SlugEditorFieldProps) {\n const { performUniqueCheck } = props;\n const [status, setStatus] = React.useState<CheckerState>(props.value ? 'checking' : 'unique');\n const [debouncedValue] = useDebounce(props.value, 1000);\n\n /**\n * Check the uniqueness of the slug in the current space.\n * The slug is unique if there is no published entry other than the\n * current one, with the same slug.\n */\n React.useEffect(() => {\n if (!debouncedValue) {\n setStatus('unique');\n return;\n }\n setStatus('checking');\n performUniqueCheck(debouncedValue)\n .then((unique) => {\n setStatus(unique ? 'unique' : 'duplicate');\n })\n .catch(() => {\n setStatus('checking');\n });\n }, [debouncedValue, performUniqueCheck]);\n\n return status;\n}\n\nexport function SlugEditorFieldStatic(\n props: SlugEditorFieldProps & { onChange?: Function; onBlur?: Function }\n) {\n const { hasError, isDisabled, value, setValue, onChange, onBlur } = props;\n\n const status = useUniqueChecker(props);\n\n return (\n <div className={styles.inputContainer}>\n <LinkIcon className={styles.icon} />\n <TextInput\n className={styles.input}\n isInvalid={hasError || status === 'duplicate'}\n isDisabled={isDisabled}\n value={value || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value);\n if (onChange) {\n onChange();\n }\n }}\n onBlur={() => {\n if (onBlur) {\n onBlur();\n }\n }}\n />\n {status === 'checking' && (\n <div className={styles.spinnerContainer}>\n <Spinner testId=\"slug-editor-spinner\" />\n </div>\n )}\n {status === 'duplicate' && (\n <ValidationMessage\n testId=\"slug-editor-duplicate-error\"\n className={styles.uniqueValidationError}>\n This slug has already been published in another entry\n </ValidationMessage>\n )}\n </div>\n );\n}\n\nexport function SlugEditorField(props: SlugEditorFieldProps) {\n const { titleValue, isOptionalLocaleWithFallback, locale, createdAt, value } = props;\n\n const areEqual = React.useCallback(() => {\n const potentialSlug = makeSlug(titleValue, {\n isOptionalLocaleWithFallback: isOptionalLocaleWithFallback,\n locale: locale,\n createdAt: createdAt,\n });\n return value === potentialSlug;\n }, [titleValue, isOptionalLocaleWithFallback, locale, createdAt, value]);\n\n const [check, setCheck] = React.useState<boolean>(() => {\n if (props.value) {\n if (!props.titleValue) {\n return false;\n }\n return areEqual();\n }\n return true;\n });\n\n React.useEffect(() => {\n if (areEqual()) {\n setCheck(true);\n }\n }, [props.titleValue, areEqual]);\n\n useSlugUpdater(props, check);\n\n return (\n <SlugEditorFieldStatic\n {...props}\n onChange={() => {\n setCheck(false);\n }}\n onBlur={() => {\n if (areEqual()) {\n setCheck(true);\n }\n }}\n />\n );\n}\n","import React from 'react';\n\nimport { FieldExtensionSDK, FieldAPI } from '@contentful/app-sdk';\n\ntype Nullable = null | undefined;\n\ninterface TrackingFieldConnectorState<ValueType> {\n titleValue: ValueType | Nullable;\n isPublished: boolean;\n isSame: boolean;\n}\n\ninterface TrackingFieldConnectorProps<ValueType> {\n sdk: FieldExtensionSDK;\n field: FieldAPI;\n defaultLocale: string;\n trackingFieldId?: string;\n isOptionalLocaleWithFallback: boolean;\n children: (state: TrackingFieldConnectorState<ValueType>) => React.ReactNode;\n}\n\nfunction getTitleField(sdk: FieldExtensionSDK, trackingFieldId?: string) {\n const { entry, contentType } = sdk;\n if (trackingFieldId && entry.fields[trackingFieldId]) {\n return entry.fields[trackingFieldId];\n }\n return entry.fields[contentType.displayField];\n}\n\nexport class TrackingFieldConnector<ValueType> extends React.Component<\n TrackingFieldConnectorProps<ValueType>,\n TrackingFieldConnectorState<ValueType>\n> {\n static defaultProps = {\n children: () => {\n return null;\n },\n };\n\n constructor(props: TrackingFieldConnectorProps<ValueType>) {\n super(props);\n const titleField = getTitleField(props.sdk, props.trackingFieldId);\n const entrySys = props.sdk.entry.getSys();\n const isSame = titleField ? props.field.id === titleField.id : false;\n this.state = {\n titleValue: titleField ? titleField.getValue() : '',\n isPublished: Boolean(entrySys.publishedVersion),\n isSame,\n };\n }\n\n unsubscribeValue: Function | null = null;\n unsubscribeLocalizedValue: Function | null = null;\n unsubscribeSysChanges: Function | null = null;\n\n componentDidMount() {\n this.unsubscribeSysChanges = this.props.sdk.entry.onSysChanged((sys) => {\n this.setState({\n isPublished: Boolean(sys.publishedVersion),\n });\n });\n\n const titleField = getTitleField(this.props.sdk, this.props.trackingFieldId);\n\n // the content type's display field might not exist\n if (!titleField) {\n return;\n }\n\n if (!this.state.isSame) {\n this.unsubscribeLocalizedValue = titleField.onValueChanged(\n this.props.field.locale,\n (value: ValueType | Nullable) => {\n this.setState({ titleValue: value });\n }\n );\n }\n\n if (this.props.field.locale !== this.props.defaultLocale) {\n if (!this.props.isOptionalLocaleWithFallback) {\n this.unsubscribeValue = titleField.onValueChanged(\n this.props.defaultLocale,\n (value: ValueType | Nullable) => {\n if (!titleField.getValue(this.props.field.locale)) {\n this.setState({ titleValue: value });\n }\n }\n );\n }\n }\n }\n\n componentWillUnmount() {\n if (typeof this.unsubscribeValue === 'function') {\n this.unsubscribeValue();\n }\n if (typeof this.unsubscribeLocalizedValue === 'function') {\n this.unsubscribeLocalizedValue();\n }\n if (typeof this.unsubscribeSysChanges === 'function') {\n this.unsubscribeSysChanges();\n }\n }\n\n render() {\n return this.props.children({\n ...this.state,\n });\n }\n}\n","import * as React from 'react';\n\nimport { FieldExtensionSDK, FieldAPI, ValidationError } from '@contentful/app-sdk';\nimport { FieldConnector } from '@contentful/field-editor-shared';\n\nimport { SlugEditorField, SlugEditorFieldStatic } from './SlugEditorField';\nimport { TrackingFieldConnector } from './TrackingFieldConnector';\n\nexport interface SlugEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n\n baseSdk: FieldExtensionSDK;\n\n /**\n * sdk.field\n */\n field: FieldAPI;\n\n parameters?: {\n instance: {\n trackingFieldId?: string;\n };\n };\n}\n\nfunction isSupportedFieldTypes(val: string): val is 'Symbol' {\n return val === 'Symbol';\n}\n\nfunction FieldConnectorCallback({\n Component,\n value,\n disabled,\n setValue,\n errors,\n titleValue,\n isOptionalLocaleWithFallback,\n locale,\n createdAt,\n performUniqueCheck,\n}: {\n Component: typeof SlugEditorFieldStatic | typeof SlugEditorField;\n value: string | null | undefined;\n disabled: boolean;\n titleValue: string | null | undefined;\n setValue: (value: string | null | undefined) => Promise<unknown>;\n errors: ValidationError[];\n isOptionalLocaleWithFallback: boolean;\n locale: FieldAPI['locale'];\n createdAt: string;\n performUniqueCheck: (value: string) => Promise<boolean>;\n}) {\n // it is needed to silent permission errors\n // this happens when setValue is called on a field which is disabled for permission reasons\n const safeSetValue = React.useCallback(\n async (...args: Parameters<typeof setValue>) => {\n try {\n await setValue(...args);\n } catch (e) {\n // do nothing\n }\n },\n [setValue]\n );\n\n return (\n <div data-test-id=\"slug-editor\">\n <Component\n locale={locale}\n createdAt={createdAt}\n performUniqueCheck={performUniqueCheck}\n hasError={errors.length > 0}\n value={value}\n isOptionalLocaleWithFallback={isOptionalLocaleWithFallback}\n isDisabled={disabled}\n titleValue={titleValue}\n setValue={safeSetValue}\n />\n </div>\n );\n}\n\nexport function SlugEditor(props: SlugEditorProps) {\n const { field, parameters } = props;\n const { locales, entry, space } = props.baseSdk;\n\n if (!isSupportedFieldTypes(field.type)) {\n throw new Error(`\"${field.type}\" field type is not supported by SlugEditor`);\n }\n\n const trackingFieldId = parameters?.instance?.trackingFieldId ?? undefined;\n const entrySys = entry.getSys();\n\n const isLocaleOptional = locales.optional[field.locale];\n const localeFallbackCode = locales.fallbacks[field.locale];\n\n // If the field or the locale are not required (there's a locale setting that\n // allows publishing even if the field is required) and if the locale has a\n // fallback than there's no need for a slug unless the user manually enters\n // one or the title field is also localized with a custom value.\n const isOptionalFieldLocale = Boolean(!field.required || isLocaleOptional);\n const isOptionalLocaleWithFallback = Boolean(\n isOptionalFieldLocale && localeFallbackCode && locales.available.includes(localeFallbackCode)\n );\n\n const performUniqueCheck = React.useCallback(\n (value: string) => {\n const searchQuery = {\n content_type: entrySys?.contentType?.sys?.id,\n [`fields.${field.id}.${field.locale}`]: value,\n 'sys.id[ne]': entrySys.id,\n 'sys.publishedAt[exists]': true,\n limit: 0,\n };\n return space.getEntries(searchQuery).then((res) => {\n return res.total === 0;\n });\n },\n [entrySys?.contentType?.sys?.id, field.id, field.locale, entrySys.id, space]\n );\n\n return (\n <TrackingFieldConnector<string>\n sdk={props.baseSdk}\n field={field}\n defaultLocale={locales.default}\n isOptionalLocaleWithFallback={isOptionalLocaleWithFallback}\n trackingFieldId={trackingFieldId}>\n {({ titleValue, isPublished, isSame }) => (\n <FieldConnector<string>\n field={field}\n isInitiallyDisabled={props.isInitiallyDisabled}\n throttle={0}>\n {({ value, errors, disabled, setValue, externalReset }) => {\n const shouldTrackTitle = isPublished === false && isSame === false;\n\n const Component = shouldTrackTitle ? SlugEditorField : SlugEditorFieldStatic;\n\n return (\n <FieldConnectorCallback\n Component={Component}\n titleValue={titleValue}\n value={value}\n errors={errors}\n disabled={disabled}\n setValue={setValue}\n isOptionalLocaleWithFallback={isOptionalLocaleWithFallback}\n createdAt={entrySys.createdAt}\n locale={field.locale}\n performUniqueCheck={performUniqueCheck}\n key={`slug-editor-${externalReset}`}\n />\n );\n }}\n </FieldConnector>\n )}\n </TrackingFieldConnector>\n );\n}\n\nSlugEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n"],"names":["CF_GENERATED_SLUG_MAX_LENGTH","languages","supportedLanguage","locale","prefix","slice","toLowerCase","indexOf","slugify","text","getSlug","separator","lang","truncate","custom","formatTwoDigit","num","asString","String","length","formatUtcDate","date","year","getFullYear","month","getUTCMonth","day","getUTCDate","hour","getUTCHours","minutes","getUTCMinutes","seconds","getUTCSeconds","untitledSlug","isOptionalLocaleWithFallback","createdAt","createdAtFormatted","Date","makeSlug","title","options","inputContainer","css","position","input","paddingLeft","icon","left","top","zIndex","width","height","fill","tokens","gray500","spinnerContainer","right","uniqueValidationError","marginTop","spacingS","useSlugUpdater","props","check","value","setValue","titleValue","React","useEffect","newSlug","useUniqueChecker","performUniqueCheck","status","setStatus","useState","debouncedValue","useDebounce","then","unique","catch","SlugEditorFieldStatic","hasError","isDisabled","onChange","onBlur","className","styles","LinkIcon","TextInput","isInvalid","e","target","Spinner","testId","ValidationMessage","SlugEditorField","areEqual","useCallback","potentialSlug","setCheck","getTitleField","sdk","trackingFieldId","entry","contentType","fields","displayField","TrackingFieldConnector","Component","constructor","unsubscribeValue","unsubscribeLocalizedValue","unsubscribeSysChanges","titleField","entrySys","getSys","isSame","field","id","state","getValue","isPublished","Boolean","publishedVersion","componentDidMount","onSysChanged","sys","setState","onValueChanged","defaultLocale","componentWillUnmount","render","children","defaultProps","isSupportedFieldTypes","val","FieldConnectorCallback","disabled","errors","safeSetValue","args","SlugEditor","parameters","locales","space","baseSdk","type","Error","instance","undefined","isLocaleOptional","optional","localeFallbackCode","fallbacks","isOptionalFieldLocale","required","available","includes","searchQuery","content_type","limit","getEntries","res","total","default","FieldConnector","isInitiallyDisabled","throttle","externalReset","shouldTrackTitle","key"],"mappings":"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"}
package/dist/index.js DELETED
@@ -1,8 +0,0 @@
1
-
2
- 'use strict'
3
-
4
- if (process.env.NODE_ENV === 'production') {
5
- module.exports = require('./field-editor-slug.cjs.production.min.js')
6
- } else {
7
- module.exports = require('./field-editor-slug.cjs.development.js')
8
- }