pageflow 15.7.0 → 15.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +103 -199
  3. data/README.md +1 -9
  4. data/Rakefile +4 -1
  5. data/admins/pageflow/entry.rb +32 -6
  6. data/admins/pageflow/membership.rb +5 -1
  7. data/admins/pageflow/user.rb +7 -0
  8. data/app/assets/javascripts/pageflow/admin/entries.js +40 -0
  9. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +65 -0
  10. data/app/assets/stylesheets/pageflow/admin.scss +1 -0
  11. data/app/assets/stylesheets/pageflow/editor/base.scss +2 -6
  12. data/app/assets/stylesheets/pageflow/editor/dialogs.scss +2 -0
  13. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +9 -0
  14. data/app/assets/stylesheets/pageflow/editor/info_box.scss +13 -3
  15. data/app/assets/stylesheets/pageflow/mixins/buttons.scss +1 -0
  16. data/app/assets/stylesheets/pageflow/page.scss +0 -2
  17. data/app/assets/stylesheets/pageflow/themes/default/page.scss +1 -1
  18. data/app/assets/stylesheets/pageflow/ui/forms.scss +4 -1
  19. data/app/controllers/pageflow/editor/file_import_controller.rb +32 -42
  20. data/app/controllers/pageflow/entries_controller.rb +25 -1
  21. data/app/helpers/pageflow/admin/permalinks_helper.rb +15 -0
  22. data/app/helpers/pageflow/entries_helper.rb +9 -1
  23. data/app/helpers/pageflow/themings_helper.rb +1 -1
  24. data/app/inputs/pageflow_permalink_input.rb +47 -0
  25. data/app/models/concerns/pageflow/permalinkable.rb +12 -0
  26. data/app/models/concerns/pageflow/reusable_file.rb +5 -0
  27. data/app/models/concerns/pageflow/uploadable_file.rb +4 -0
  28. data/app/models/pageflow/customized_theme.rb +4 -2
  29. data/app/models/pageflow/entry.rb +13 -0
  30. data/app/models/pageflow/entry_at_revision.rb +2 -1
  31. data/app/models/pageflow/entry_duplicate.rb +7 -0
  32. data/app/models/pageflow/image_file_url_templates.rb +2 -2
  33. data/app/models/pageflow/permalink.rb +39 -0
  34. data/app/models/pageflow/permalink_directory.rb +10 -0
  35. data/app/models/pageflow/published_entry.rb +17 -0
  36. data/app/models/pageflow/revision.rb +1 -1
  37. data/app/models/pageflow/theme_customization_file.rb +6 -1
  38. data/app/models/pageflow/theming.rb +1 -0
  39. data/app/views/admin/entries/_form.html.erb +9 -1
  40. data/app/views/admin/entries/_permalink_inputs.html.erb +6 -0
  41. data/app/views/admin/entries/permalink_inputs.html.erb +7 -0
  42. data/app/views/pageflow/editor/file_import/start_import_job.json.jbuilder +10 -0
  43. data/app/views/pageflow/files/_file.json.jbuilder +1 -0
  44. data/config/initializers/mime_types.rb +1 -0
  45. data/config/routes.rb +8 -5
  46. data/db/migrate/20221024100724_create_pageflow_permalink_directories.rb +10 -0
  47. data/db/migrate/20221025074049_add_permalink_attributes_to_entries.rb +5 -0
  48. data/db/migrate/20221027065022_create_pageflow_permalinks.rb +12 -0
  49. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +166 -169
  50. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +44 -2
  51. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +5 -5
  52. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +1 -1
  53. data/entry_types/paged/config/initializers/features.rb +2 -0
  54. data/entry_types/paged/config/locales/{new/help.de.yml → de.yml} +74 -65
  55. data/entry_types/paged/config/locales/{new/help.en.yml → en.yml} +66 -56
  56. data/entry_types/scrolled/app/helpers/pageflow_scrolled/favicon_helper.rb +39 -13
  57. data/entry_types/scrolled/app/helpers/pageflow_scrolled/generated_media_queries_helper.rb +55 -0
  58. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +6 -2
  59. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +2 -0
  60. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/_manifest.json.jbuilder +16 -0
  61. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +9 -3
  62. data/entry_types/scrolled/app/views/pageflow_scrolled/favicons/_entry.html.erb +16 -10
  63. data/entry_types/scrolled/config/locales/de.yml +265 -76
  64. data/entry_types/scrolled/config/locales/en.yml +266 -77
  65. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +3 -3
  66. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +14 -0
  67. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +1 -1
  68. data/entry_types/scrolled/lib/pageflow_scrolled/web_app_manifest.rb +11 -0
  69. data/entry_types/scrolled/lib/pageflow_scrolled.rb +39 -1
  70. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +3 -2
  71. data/entry_types/scrolled/package/contentElements-editor.js +124 -38
  72. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  73. data/entry_types/scrolled/package/contentElements-frontend.js +321 -27
  74. data/entry_types/scrolled/package/editor.js +1345 -739
  75. data/entry_types/scrolled/package/frontend/EditableInlineText.module-c6672f27.js +5314 -0
  76. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-9fb97827.js → PhonePlatformContext-22e65f92.js} +40 -4
  77. data/entry_types/scrolled/package/frontend/{Viewer-e2290ea0.js → Viewer-6b05522f.js} +6 -40
  78. data/entry_types/scrolled/package/frontend/arrowRight-7e3d9dd5.js +42 -0
  79. data/entry_types/scrolled/package/frontend/{components-6ab26015.js → components-487daafa.js} +546 -361
  80. data/entry_types/scrolled/package/frontend/index.css +1 -1
  81. data/entry_types/scrolled/package/frontend/index.js +197 -3674
  82. data/entry_types/scrolled/package/package.json +3 -2
  83. data/entry_types/scrolled/package/testHelpers.js +12 -2
  84. data/entry_types/scrolled/package/widgets/defaultNavigation.css +1 -1
  85. data/entry_types/scrolled/package/widgets/defaultNavigation.js +35 -32
  86. data/entry_types/scrolled/spec/fixtures/image.ico +0 -0
  87. data/lib/pageflow/entry_type.rb +6 -2
  88. data/lib/pageflow/user_mixin.rb +6 -0
  89. data/lib/pageflow/version.rb +1 -1
  90. data/package/editor.js +122 -149
  91. data/package/frontend.js +19 -2
  92. data/package/testHelpers.js +39 -6
  93. data/spec/factories/entries.rb +17 -0
  94. data/spec/factories/permalink_directory.rb +6 -0
  95. data/spec/factories/permalinks.rb +4 -0
  96. data/spec/factories/published_entries.rb +2 -0
  97. metadata +30 -47
  98. data/entry_types/paged/config/locales/new/video_contain.de.yml +0 -7
  99. data/entry_types/paged/config/locales/new/video_contain.en.yml +0 -7
  100. data/entry_types/scrolled/config/locales/new/before_after_slider.de.yml +0 -8
  101. data/entry_types/scrolled/config/locales/new/before_after_slider.en.yml +0 -8
  102. data/entry_types/scrolled/config/locales/new/center_ragged.de.yml +0 -8
  103. data/entry_types/scrolled/config/locales/new/center_ragged.en.yml +0 -9
  104. data/entry_types/scrolled/config/locales/new/consent.de.yml +0 -25
  105. data/entry_types/scrolled/config/locales/new/consent.en.yml +0 -24
  106. data/entry_types/scrolled/config/locales/new/content_element_categories.de.yml +0 -39
  107. data/entry_types/scrolled/config/locales/new/content_element_categories.en.yml +0 -39
  108. data/entry_types/scrolled/config/locales/new/default_transition.de.yml +0 -14
  109. data/entry_types/scrolled/config/locales/new/default_transition.en.yml +0 -14
  110. data/entry_types/scrolled/config/locales/new/header_line_breaks.de.yml +0 -28
  111. data/entry_types/scrolled/config/locales/new/header_line_breaks.en.yml +0 -27
  112. data/entry_types/scrolled/config/locales/new/header_size.de.yml +0 -17
  113. data/entry_types/scrolled/config/locales/new/header_size.en.yml +0 -17
  114. data/entry_types/scrolled/config/locales/new/iframe_embed.de.yml +0 -39
  115. data/entry_types/scrolled/config/locales/new/iframe_embed.en.yml +0 -39
  116. data/entry_types/scrolled/config/locales/new/inline_loops.de.yml +0 -26
  117. data/entry_types/scrolled/config/locales/new/inline_loops.en.yml +0 -26
  118. data/entry_types/scrolled/config/locales/new/portrait_inline_image.de.yml +0 -9
  119. data/entry_types/scrolled/config/locales/new/portrait_inline_image.en.yml +0 -9
  120. data/entry_types/scrolled/config/locales/new/section_width.de.yml +0 -10
  121. data/entry_types/scrolled/config/locales/new/section_width.en.yml +0 -10
  122. data/entry_types/scrolled/config/locales/new/typography_variants.de.yml +0 -7
  123. data/entry_types/scrolled/config/locales/new/typography_variants.en.yml +0 -7
  124. data/entry_types/scrolled/config/locales/new/video_embed_poster.de.yml +0 -8
  125. data/entry_types/scrolled/config/locales/new/video_embed_poster.en.yml +0 -8
  126. data/entry_types/scrolled/config/locales/new/waveform_styles.de.yml +0 -11
  127. data/entry_types/scrolled/config/locales/new/waveform_styles.en.yml +0 -12
  128. data/entry_types/scrolled/config/locales/new/widgets.de.yml +0 -6
  129. data/entry_types/scrolled/config/locales/new/widgets.en.yml +0 -6
  130. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/browserconfig.xml +0 -9
  131. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/mstile-150x150.png +0 -0
  132. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/safari-pinned-tab.svg +0 -46
  133. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/site.webmanifest +0 -19
  134. data/entry_types/scrolled/package/frontend/EditableInlineText.module-b9923660.js +0 -993
  135. data/entry_types/scrolled/package/frontend/usePhonePlatform-2857c22b.js +0 -34
@@ -1,4 +1,5 @@
1
- import React, { useReducer, useMemo, useCallback, createContext as createContext$1, useContext } from 'react';
1
+ import { browser } from 'pageflow/frontend';
2
+ import React, { useReducer, useMemo, useCallback, createContext as createContext$1, useContext, useState, useEffect } from 'react';
2
3
  import I18n from 'i18n-js';
3
4
  import { createContext, useContextSelector } from 'use-context-selector';
4
5
  import { createSelectorCreator, defaultMemoize, createSelector } from 'reselect';
@@ -820,11 +821,20 @@ function useSectionContentElements(_ref2) {
820
821
  };
821
822
  });
822
823
  }
824
+ function useChapter(_ref3) {
825
+ var permaId = _ref3.permaId;
826
+ var chapters = useChapters();
827
+ return useMemo(function () {
828
+ return chapters.find(function (chapter) {
829
+ return chapter.permaId === permaId;
830
+ });
831
+ }, [chapters, permaId]);
832
+ }
823
833
  function useChapters() {
824
834
  var chapters = useEntryStateCollectionItems('chapters');
825
835
  return useMemo(function () {
826
836
  var chapterSlugs = {};
827
- return chapters.map(function (chapter) {
837
+ return chapters.map(function (chapter, index) {
828
838
  var chapterSlug = chapter.configuration.title;
829
839
 
830
840
  if (chapterSlug) {
@@ -846,6 +856,7 @@ function useChapters() {
846
856
  return {
847
857
  id: chapter.id,
848
858
  permaId: chapter.permaId,
859
+ index: index,
849
860
  title: chapter.configuration.title,
850
861
  summary: chapter.configuration.summary,
851
862
  chapterSlug: chapterSlug
@@ -901,7 +912,7 @@ function getFileUrl(collectionName, file, quality, urlTemplates) {
901
912
  var template = templates[quality];
902
913
 
903
914
  if (template) {
904
- return template.replace(':id_partition', idPartition(file.id)).replace(':basename', file.basename).replace(':pageflow_hls_qualities', function () {
915
+ return template.replace(':id_partition', idPartition(file.id)).replace(':basename', file.basename).replace(':extension', file.extension).replace(':pageflow_hls_qualities', function () {
905
916
  return hlsQualities(file);
906
917
  });
907
918
  }
@@ -1180,6 +1191,31 @@ function useI18n() {
1180
1191
  };
1181
1192
  }
1182
1193
 
1194
+ var BrowserFeaturesAvailableContext = createContext$1(); // Browser feature detection is not available during server side
1195
+ // rendering. To prevent mismatches during hydration, we keep features
1196
+ // disabled in the initial render. Since hydration only starts after
1197
+ // feature detection has finished, we can immediately re-render once
1198
+ // the provider has mounted.
1199
+
1200
+ function BrowserFeaturesProvider(_ref) {
1201
+ var children = _ref.children;
1202
+
1203
+ var _useState = useState(false),
1204
+ _useState2 = _slicedToArray(_useState, 2),
1205
+ isAvailable = _useState2[0],
1206
+ setIsAvailable = _useState2[1];
1207
+
1208
+ useEffect(function () {
1209
+ return setIsAvailable(true);
1210
+ }, []);
1211
+ return /*#__PURE__*/React.createElement(BrowserFeaturesAvailableContext.Provider, {
1212
+ value: isAvailable
1213
+ }, children);
1214
+ }
1215
+ function useBrowserFeature(name) {
1216
+ return useContext(BrowserFeaturesAvailableContext) && browser.has(name);
1217
+ }
1218
+
1183
1219
  var PhonePlatformContext = React.createContext(false);
1184
1220
 
1185
- export { updateContentElementConfiguration as A, EntryStateProvider as E, LocaleProvider as L, PhonePlatformContext as P, _objectWithoutProperties as _, _objectSpread2 as a, _defineProperty as b, _slicedToArray as c, useLocale as d, useLegalInfo as e, useTheme as f, useEntryMetadata as g, useNestedFiles as h, useFile as i, useSectionContentElements as j, useSectionsWithChapter as k, useEntryStructure as l, useWidget as m, getFileUrlTemplateHost as n, _toConsumableArray as o, useAvailableQualities as p, useEntryStateDispatch as q, useSection as r, setupI18n as s, useAdditionalSeedData as t, useI18n as u, useChapters as v, useCredits as w, useFileRights as x, useShareProviders as y, useShareUrl as z };
1221
+ export { useShareProviders as A, BrowserFeaturesProvider as B, useShareUrl as C, updateContentElementConfiguration as D, EntryStateProvider as E, _unsupportedIterableToArray as F, LocaleProvider as L, PhonePlatformContext as P, _objectWithoutProperties as _, _objectSpread2 as a, _defineProperty as b, _slicedToArray as c, useLocale as d, useLegalInfo as e, useTheme as f, useEntryMetadata as g, useNestedFiles as h, useFile as i, _toConsumableArray as j, useSectionContentElements as k, useAdditionalSeedData as l, useSectionsWithChapter as m, useBrowserFeature as n, useEntryStateDispatch as o, useSection as p, useChapter as q, useEntryStructure as r, useWidget as s, getFileUrlTemplateHost as t, useI18n as u, useAvailableQualities as v, setupI18n as w, useChapters as x, useCredits as y, useFileRights as z };
@@ -1,13 +1,13 @@
1
1
  import 'pageflow/frontend';
2
2
  import React, { useMemo, useEffect, useRef, useState } from 'react';
3
3
  import ReactDOM from 'react-dom';
4
- import { _ as _objectWithoutProperties, u as useI18n, b as _defineProperty, c as _slicedToArray } from './PhonePlatformContext-9fb97827.js';
4
+ import { _ as _objectWithoutProperties, u as useI18n, b as _defineProperty, n as useBrowserFeature, c as _slicedToArray } from './PhonePlatformContext-22e65f92.js';
5
5
  import 'i18n-js';
6
6
  import 'use-context-selector';
7
7
  import 'reselect';
8
8
  import 'slugify';
9
9
  import classNames from 'classnames';
10
- import { u as useBrowserFeature, a as usePhonePlatform } from './usePhonePlatform-2857c22b.js';
10
+ import { A as ArrowRightIcon, u as usePhonePlatform } from './arrowRight-7e3d9dd5.js';
11
11
  import { PanoViewer } from '@egjs/view360';
12
12
  import screenfull from 'screenfull';
13
13
 
@@ -165,40 +165,6 @@ var ArrowLeftIcon = (function (_ref) {
165
165
  }));
166
166
  });
167
167
 
168
- function _extends$3() {
169
- _extends$3 = Object.assign || function (target) {
170
- for (var i = 1; i < arguments.length; i++) {
171
- var source = arguments[i];
172
-
173
- for (var key in source) {
174
- if (Object.prototype.hasOwnProperty.call(source, key)) {
175
- target[key] = source[key];
176
- }
177
- }
178
- }
179
-
180
- return target;
181
- };
182
-
183
- return _extends$3.apply(this, arguments);
184
- }
185
- var ArrowRightIcon = (function (_ref) {
186
- var _ref$styles = _ref.styles,
187
- styles = _ref$styles === void 0 ? {} : _ref$styles,
188
- props = _objectWithoutProperties(_ref, ["styles"]);
189
-
190
- return /*#__PURE__*/React.createElement("svg", _extends$3({
191
- xmlns: "http://www.w3.org/2000/svg",
192
- className: (styles["h-5"] || "h-5") + " " + (styles["w-5"] || "w-5"),
193
- viewBox: "0 0 20 20",
194
- fill: "currentColor"
195
- }, props), /*#__PURE__*/React.createElement("path", {
196
- fillRule: "evenodd",
197
- d: "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z",
198
- clipRule: "evenodd"
199
- }));
200
- });
201
-
202
168
  var styles$2 = {"indicator":"PanoramaIndicator-module_indicator__3A90v","visible":"PanoramaIndicator-module_visible__3LOgm","arrow":"PanoramaIndicator-module_arrow__QV1Pd","arrowLeft":"PanoramaIndicator-module_arrowLeft__Jh7GC PanoramaIndicator-module_arrow__QV1Pd","arrowRight":"PanoramaIndicator-module_arrowRight__ZZBtO PanoramaIndicator-module_arrow__QV1Pd","nudgeLeft":"PanoramaIndicator-module_nudgeLeft__IU_Iy","nudgeRight":"PanoramaIndicator-module_nudgeRight__3XzNu","text":"PanoramaIndicator-module_text__2FzUy"};
203
169
 
204
170
  function PanoramaIndicator(_ref) {
@@ -258,8 +224,8 @@ function FullscreenIndicator(_ref) {
258
224
 
259
225
  var styles$4 = {"full":"Viewer-module_full__1q18y","container":"Viewer-module_container__3eJ34 Viewer-module_full__1q18y","controls":"Viewer-module_controls__3BTof","spinner":"Viewer-module_spinner__2oRve","spin":"Viewer-module_spin__3jBR2","isLoading":"Viewer-module_isLoading__sQuGw"};
260
226
 
261
- function _extends$4() {
262
- _extends$4 = Object.assign || function (target) {
227
+ function _extends$3() {
228
+ _extends$3 = Object.assign || function (target) {
263
229
  for (var i = 1; i < arguments.length; i++) {
264
230
  var source = arguments[i];
265
231
 
@@ -273,13 +239,13 @@ function _extends$4() {
273
239
  return target;
274
240
  };
275
241
 
276
- return _extends$4.apply(this, arguments);
242
+ return _extends$3.apply(this, arguments);
277
243
  }
278
244
  var SpinnerIcon = (function (_ref) {
279
245
  var _ref$styles = _ref.styles,
280
246
  props = _objectWithoutProperties(_ref, ["styles"]);
281
247
 
282
- return /*#__PURE__*/React.createElement("svg", _extends$4({
248
+ return /*#__PURE__*/React.createElement("svg", _extends$3({
283
249
  xmlns: "http://www.w3.org/2000/svg",
284
250
  fill: "none",
285
251
  viewBox: "0 0 24 24"
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import { P as PhonePlatformContext, _ as _objectWithoutProperties } from './PhonePlatformContext-22e65f92.js';
3
+
4
+ function usePhonePlatform() {
5
+ return React.useContext(PhonePlatformContext);
6
+ }
7
+
8
+ function _extends() {
9
+ _extends = Object.assign || function (target) {
10
+ for (var i = 1; i < arguments.length; i++) {
11
+ var source = arguments[i];
12
+
13
+ for (var key in source) {
14
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
15
+ target[key] = source[key];
16
+ }
17
+ }
18
+ }
19
+
20
+ return target;
21
+ };
22
+
23
+ return _extends.apply(this, arguments);
24
+ }
25
+ var ArrowRightIcon = (function (_ref) {
26
+ var _ref$styles = _ref.styles,
27
+ styles = _ref$styles === void 0 ? {} : _ref$styles,
28
+ props = _objectWithoutProperties(_ref, ["styles"]);
29
+
30
+ return /*#__PURE__*/React.createElement("svg", _extends({
31
+ xmlns: "http://www.w3.org/2000/svg",
32
+ className: (styles["h-5"] || "h-5") + " " + (styles["w-5"] || "w-5"),
33
+ viewBox: "0 0 20 20",
34
+ fill: "currentColor"
35
+ }, props), /*#__PURE__*/React.createElement("path", {
36
+ fillRule: "evenodd",
37
+ d: "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z",
38
+ clipRule: "evenodd"
39
+ }));
40
+ });
41
+
42
+ export { ArrowRightIcon as A, usePhonePlatform as u };