itmar-block-packages 1.10.0 → 2.0.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 (157) hide show
  1. package/README.md +81 -2
  2. package/build/cjs/AnimationBlock.js +107 -0
  3. package/build/cjs/AnimationBlock.js.map +1 -0
  4. package/build/cjs/BlockEditWrapper.js +20 -0
  5. package/build/cjs/BlockEditWrapper.js.map +1 -0
  6. package/build/cjs/BlockPlace.js +509 -0
  7. package/build/cjs/BlockPlace.js.map +1 -0
  8. package/build/cjs/BrockInserter.js +204 -0
  9. package/build/cjs/BrockInserter.js.map +1 -0
  10. package/build/cjs/DateElm.js +321 -0
  11. package/build/cjs/DateElm.js.map +1 -0
  12. package/build/cjs/DraggableBox.js +143 -0
  13. package/build/cjs/DraggableBox.js.map +1 -0
  14. package/build/cjs/GridControls.js +421 -0
  15. package/build/cjs/GridControls.js.map +1 -0
  16. package/build/cjs/IconSelectControl.js +167 -0
  17. package/build/cjs/IconSelectControl.js.map +1 -0
  18. package/build/cjs/JapaneseHolidays.js +99 -0
  19. package/build/cjs/JapaneseHolidays.js.map +1 -0
  20. package/build/cjs/MasonryControl.js +124 -0
  21. package/build/cjs/MasonryControl.js.map +1 -0
  22. package/build/cjs/PseudoElm.js +66 -0
  23. package/build/cjs/PseudoElm.js.map +1 -0
  24. package/build/cjs/ShadowStyle.js +453 -0
  25. package/build/cjs/ShadowStyle.js.map +1 -0
  26. package/build/cjs/SwiperControl.js +267 -0
  27. package/build/cjs/SwiperControl.js.map +1 -0
  28. package/build/cjs/ToggleElement.js +17 -0
  29. package/build/cjs/ToggleElement.js.map +1 -0
  30. package/build/cjs/TypographyControls.js +151 -0
  31. package/build/cjs/TypographyControls.js.map +1 -0
  32. package/build/cjs/UpdateAllPostsBlockAttributes.js +137 -0
  33. package/build/cjs/UpdateAllPostsBlockAttributes.js.map +1 -0
  34. package/build/cjs/ZipAddress.js +34 -0
  35. package/build/cjs/ZipAddress.js.map +1 -0
  36. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +117 -0
  37. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  38. package/build/cjs/blockStore.js +65 -0
  39. package/build/cjs/blockStore.js.map +1 -0
  40. package/build/cjs/cssPropertes.js +157 -0
  41. package/build/cjs/cssPropertes.js.map +1 -0
  42. package/build/cjs/customFooks.js +300 -0
  43. package/build/cjs/customFooks.js.map +1 -0
  44. package/build/cjs/formatCreate.js +160 -0
  45. package/build/cjs/formatCreate.js.map +1 -0
  46. package/build/cjs/hslToRgb.js +133 -0
  47. package/build/cjs/hslToRgb.js.map +1 -0
  48. package/build/cjs/index.js +115 -0
  49. package/build/cjs/index.js.map +1 -0
  50. package/build/cjs/mediaUpload.js +182 -0
  51. package/build/cjs/mediaUpload.js.map +1 -0
  52. package/build/cjs/node_modules/nanoid/index.js +30 -0
  53. package/build/cjs/node_modules/nanoid/index.js.map +1 -0
  54. package/build/cjs/node_modules/nanoid/url-alphabet/index.js +7 -0
  55. package/build/cjs/node_modules/nanoid/url-alphabet/index.js.map +1 -0
  56. package/build/cjs/shopfiApi.js +188 -0
  57. package/build/cjs/shopfiApi.js.map +1 -0
  58. package/build/cjs/validationCheck.js +15 -0
  59. package/build/cjs/validationCheck.js.map +1 -0
  60. package/build/cjs/wordpressApi.js +631 -0
  61. package/build/cjs/wordpressApi.js.map +1 -0
  62. package/build/esm/AnimationBlock.js +102 -0
  63. package/build/esm/AnimationBlock.js.map +1 -0
  64. package/build/esm/BlockEditWrapper.js +16 -0
  65. package/build/esm/BlockEditWrapper.js.map +1 -0
  66. package/build/esm/BlockPlace.js +503 -0
  67. package/build/esm/BlockPlace.js.map +1 -0
  68. package/build/esm/BrockInserter.js +202 -0
  69. package/build/esm/BrockInserter.js.map +1 -0
  70. package/build/esm/DateElm.js +309 -0
  71. package/build/esm/DateElm.js.map +1 -0
  72. package/build/esm/DraggableBox.js +138 -0
  73. package/build/esm/DraggableBox.js.map +1 -0
  74. package/build/esm/GridControls.js +417 -0
  75. package/build/esm/GridControls.js.map +1 -0
  76. package/build/esm/IconSelectControl.js +163 -0
  77. package/build/esm/IconSelectControl.js.map +1 -0
  78. package/build/esm/JapaneseHolidays.js +97 -0
  79. package/build/esm/JapaneseHolidays.js.map +1 -0
  80. package/{src → build/esm}/MasonryControl.js +108 -113
  81. package/build/esm/MasonryControl.js.map +1 -0
  82. package/build/esm/PseudoElm.js +61 -0
  83. package/build/esm/PseudoElm.js.map +1 -0
  84. package/build/esm/ShadowStyle.js +448 -0
  85. package/build/esm/ShadowStyle.js.map +1 -0
  86. package/{src → build/esm}/SwiperControl.js +265 -265
  87. package/build/esm/SwiperControl.js.map +1 -0
  88. package/build/esm/ToggleElement.js +13 -0
  89. package/build/esm/ToggleElement.js.map +1 -0
  90. package/build/esm/TypographyControls.js +147 -0
  91. package/build/esm/TypographyControls.js.map +1 -0
  92. package/build/esm/UpdateAllPostsBlockAttributes.js +133 -0
  93. package/build/esm/UpdateAllPostsBlockAttributes.js.map +1 -0
  94. package/build/esm/ZipAddress.js +32 -0
  95. package/build/esm/ZipAddress.js.map +1 -0
  96. package/build/esm/_virtual/_rollupPluginBabelHelpers.js +107 -0
  97. package/build/esm/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  98. package/build/esm/blockStore.js +60 -0
  99. package/build/esm/blockStore.js.map +1 -0
  100. package/build/esm/cssPropertes.js +144 -0
  101. package/build/esm/cssPropertes.js.map +1 -0
  102. package/{src → build/esm}/customFooks.js +290 -337
  103. package/build/esm/customFooks.js.map +1 -0
  104. package/build/esm/formatCreate.js +157 -0
  105. package/build/esm/formatCreate.js.map +1 -0
  106. package/build/esm/hslToRgb.js +129 -0
  107. package/build/esm/hslToRgb.js.map +1 -0
  108. package/build/esm/index.js +27 -0
  109. package/build/esm/index.js.map +1 -0
  110. package/build/esm/mediaUpload.js +176 -0
  111. package/build/esm/mediaUpload.js.map +1 -0
  112. package/build/esm/node_modules/nanoid/index.js +27 -0
  113. package/build/esm/node_modules/nanoid/index.js.map +1 -0
  114. package/build/esm/node_modules/nanoid/url-alphabet/index.js +5 -0
  115. package/build/esm/node_modules/nanoid/url-alphabet/index.js.map +1 -0
  116. package/build/esm/shopfiApi.js +184 -0
  117. package/build/esm/shopfiApi.js.map +1 -0
  118. package/build/esm/validationCheck.js +13 -0
  119. package/build/esm/validationCheck.js.map +1 -0
  120. package/build/esm/wordpressApi.js +618 -0
  121. package/build/esm/wordpressApi.js.map +1 -0
  122. package/package.json +22 -6
  123. package/build/index.asset.php +0 -1
  124. package/build/index.js +0 -25
  125. package/css/editor.css +0 -23
  126. package/css/editor.css.map +0 -1
  127. package/img/animation.png +0 -0
  128. package/img/blockplace.png +0 -0
  129. package/img/grid.png +0 -0
  130. package/img/iconControl.png +0 -0
  131. package/img/pseudo.png +0 -0
  132. package/img/shadow.png +0 -0
  133. package/img/typography.png +0 -0
  134. package/src/AnimationBlock.js +0 -112
  135. package/src/BlockEditWrapper.js +0 -11
  136. package/src/BlockPlace.js +0 -904
  137. package/src/BrockInserter.js +0 -247
  138. package/src/DateElm.js +0 -354
  139. package/src/DraggableBox.js +0 -143
  140. package/src/GridControls.js +0 -462
  141. package/src/IconSelectControl.js +0 -186
  142. package/src/PseudoElm.js +0 -54
  143. package/src/ShadowStyle.js +0 -520
  144. package/src/ToggleElement.js +0 -18
  145. package/src/TypographyControls.js +0 -145
  146. package/src/UpdateAllPostsBlockAttributes.js +0 -127
  147. package/src/ZipAddress.js +0 -35
  148. package/src/blockStore.js +0 -75
  149. package/src/cssPropertes.js +0 -212
  150. package/src/formatCreate.js +0 -179
  151. package/src/hslToRgb.js +0 -162
  152. package/src/index.js +0 -131
  153. package/src/mediaUpload.js +0 -178
  154. package/src/shopfiApi.js +0 -187
  155. package/src/validationCheck.js +0 -10
  156. package/src/wordpressApi.js +0 -686
  157. package/webpack.config.js +0 -10
@@ -1,247 +0,0 @@
1
- import {
2
- serializeBlockTree,
3
- createBlockTree,
4
- flattenBlocks,
5
- } from "./blockStore";
6
- import { createBlock, getBlockType } from "@wordpress/blocks";
7
- import { useEffect } from "@wordpress/element";
8
- import { useSelect, useDispatch } from "@wordpress/data";
9
-
10
- //フィールド生成用関数
11
- const createBlockAttr = (selectedField) => {
12
- let blockAttributes = {};
13
-
14
- switch (selectedField.block) {
15
- case "itmar/design-title":
16
- const block_class = selectedField.key.startsWith("tax_")
17
- ? selectedField.key
18
- : `sp_field_${selectedField.key}`;
19
- blockAttributes = {
20
- className: block_class,
21
- headingContent: `[${selectedField.label}]`,
22
- };
23
-
24
- break;
25
- case "core/paragraph":
26
- blockAttributes = {
27
- className: `itmar_ex_block sp_field_${selectedField.key}`,
28
- content: `[${selectedField.label}]`,
29
- };
30
- break;
31
- case "core/image":
32
- blockAttributes = {
33
- className: `itmar_ex_block sp_field_${selectedField.key}`,
34
- url: `${ec_relate_blocks.plugin_url}/assets/image/main_sample.png`,
35
- };
36
- break;
37
- case "itmar/slide-mv":
38
- const spaceAttributes = {
39
- margin_val: {
40
- type: "object",
41
- default: {
42
- top: "0em",
43
- left: "0em",
44
- bottom: "0em",
45
- right: "0em",
46
- },
47
- },
48
- padding_val: {
49
- type: "object",
50
- default: {
51
- top: "0em",
52
- left: "0em",
53
- bottom: "0em",
54
- right: "0em",
55
- },
56
- },
57
- };
58
-
59
- const imageBlock = createBlock("core/image", {
60
- className: "itmar_ex_block",
61
- url: `${ec_relate_blocks.plugin_url}/assets/image/slide_sample.png`,
62
- ...spaceAttributes,
63
- });
64
- //Design Blockの初期設定を取得
65
- const blockType = getBlockType("itmar/design-group");
66
- const defaultValBase = blockType?.attributes?.default_val?.default ?? {};
67
- const mobileValBase = blockType?.attributes?.mobile_val?.default ?? {};
68
- const slideBlock = createBlock(
69
- "itmar/design-group",
70
- {
71
- default_val: {
72
- ...defaultValBase,
73
- width_val: "fit",
74
- },
75
- mobile_val: {
76
- ...mobileValBase,
77
- width_val: "fit",
78
- },
79
- },
80
- [imageBlock]
81
- );
82
- //slideBlock をシリアライズ
83
- const serializedSlide = serializeBlockTree(slideBlock);
84
- // 同じスライドブロックを5つ複製(独立したブロックとして)
85
- const slideBlocks = Array.from({ length: 5 }, () =>
86
- createBlockTree(serializedSlide)
87
- );
88
- //子ブロック付きで返す
89
- blockAttributes = {
90
- attributes: { className: `sp_field_${selectedField.key}` },
91
- slideBlocks: slideBlocks,
92
- };
93
- break;
94
- default:
95
- blockAttributes = {
96
- className: `sp_field_${selectedField.key}`,
97
- headingContent: `[${selectedField.label}]`,
98
- };
99
- }
100
- return blockAttributes;
101
- };
102
-
103
- //表示フィールド変更によるインナーブロックの再構成
104
- export const useRebuildChangeField = (
105
- dispAttributeArray,
106
- selectedFields,
107
- pickupType,
108
- dispTaxonomies,
109
- sectionCount,
110
- domType,
111
- clientId,
112
- insertId
113
- ) => {
114
- // dispatch関数を取得
115
- const { replaceInnerBlocks } = useDispatch("core/block-editor");
116
- const pickupBlock = useSelect(
117
- (select) => select("core/block-editor").getBlock(clientId),
118
- [clientId]
119
- );
120
-
121
- useEffect(() => {
122
- //dispAttributeArray の個数調整
123
- const blocksLength = dispAttributeArray.length;
124
-
125
- if (blocksLength < sectionCount) {
126
- // dispAttributeArrayの長さが短い場合、{}を追加する
127
- const diff = sectionCount - blocksLength;
128
- for (let i = 0; i < diff; i++) {
129
- dispAttributeArray.push({});
130
- }
131
- } else {
132
- // dispAttributeArrayの長さが長い場合、余分な要素を削除する
133
- dispAttributeArray.splice(sectionCount);
134
- }
135
-
136
- // インナーブロックに差し込むブロック配列を生成
137
- const blocksArray = dispAttributeArray.map((dispAttribute, unit_index) => {
138
- // blocksAttributesArray属性で登録されたブロックのclassName一覧(sp_field_xxx を拾う)
139
- const allBlocks = Array.isArray(dispAttribute.innerBlocks)
140
- ? flattenBlocks(dispAttribute.innerBlocks) //階層になったブロックを平坦化
141
- : [];
142
-
143
- const existingKeys = allBlocks
144
- .map((block) => block.attributes?.className)
145
- .filter(Boolean)
146
- .map((cls) => {
147
- // sp_field_◯◯ か tax_◯◯ のどちらかにマッチ
148
- const match = cls.match(/sp_field_([\w-]+)|(tax_[\w-]+)/);
149
- if (!match) return null;
150
-
151
- // match[1] があれば sp_field_ のほう → プレフィックス除去
152
- // match[2] があれば tax_ のほう → そのまま返す
153
- return match[1] ?? match[2];
154
- })
155
- .filter(Boolean);
156
-
157
- // dispTaxonomies からオブジェクトを作って selectedFieldsに加えてnewSelectedFieldsを生成
158
- const newSelectedFields = [
159
- ...selectedFields,
160
- ...dispTaxonomies.map((tax) => ({
161
- key: `tax_${tax}`, // 例: "tax_category"
162
- label: tax, // 例: "category"
163
- block: "itmar/design-title",
164
- })),
165
- ];
166
-
167
- // newSelectedFieldsのうち未挿入のものだけ追加
168
- const autoGeneratedBlocks = newSelectedFields
169
- .filter((field) => !existingKeys.includes(field.key))
170
- .map((field) => {
171
- const attr = createBlockAttr(field);
172
- const blockName = field.block;
173
- const blockAttributes = attr?.attributes ?? attr;
174
- const innerBlocks = Array.isArray(attr?.slideBlocks)
175
- ? attr.slideBlocks
176
- : [];
177
-
178
- return createBlock(blockName, blockAttributes, innerBlocks);
179
- });
180
- // blocksAttributesArray属性で登録されたブロックの再構築
181
- const selectedKeys = selectedFields.map((f) => f.key);
182
-
183
- const filterBlocksRecursively = (blocks) => {
184
- return blocks
185
- .map((block) => {
186
- const className = block.attributes?.className || "";
187
- // 1. まず sp_field_ のパターンを探す
188
- let match = className.match(/sp_field_([a-zA-Z0-9_]+)/);
189
- // 2. 見つからなければ tax_○○ をチェック
190
- if (className.startsWith("tax_")) {
191
- const name = className.slice("tax_".length); // "tax_category" → "category"
192
-
193
- // dispTaxonomies に含まれないものだけ有効とする
194
- if (!dispTaxonomies.includes(name)) {
195
- // 正規表現の match 結果っぽい形の配列を自分で作る
196
- // [0] に全体一致, [1] にグループ1 というイメージ
197
- match = [`tax_${name}`, name];
198
- }
199
- }
200
-
201
- // 再帰的に innerBlocks をフィルタ
202
- const filteredInner = block.innerBlocks
203
- ? filterBlocksRecursively(block.innerBlocks)
204
- : [];
205
-
206
- const isAutoGenerated = !!match;
207
- const keep = !isAutoGenerated || selectedKeys.includes(match[1]);
208
-
209
- if (!keep) return null;
210
-
211
- // 構造を復元して返す
212
- return {
213
- ...block,
214
- innerBlocks: filteredInner,
215
- };
216
- })
217
- .filter(Boolean); // null を除去
218
- };
219
-
220
- const userBlocks = Array.isArray(dispAttribute.innerBlocks)
221
- ? filterBlocksRecursively(dispAttribute.innerBlocks).map(
222
- createBlockTree
223
- )
224
- : [];
225
-
226
- // autoGenerated(selectedFields) + userBlocks を合成
227
- const innerBlocks = [...userBlocks, ...autoGeneratedBlocks];
228
-
229
- const ret = createBlock(
230
- "itmar/design-group",
231
- {
232
- ...dispAttribute.attributes,
233
- className: `unit_design_${unit_index}`,
234
- domType: domType,
235
- },
236
- innerBlocks
237
- );
238
- return ret;
239
- });
240
- //挿入するブロックと自身のブロックが異なる場合(slide-mvにデータを入れる場合)
241
- if (insertId !== clientId) {
242
- blocksArray.push(pickupBlock);
243
- }
244
- // 既存のインナーブロックを一括置換
245
- replaceInnerBlocks(insertId, blocksArray, false);
246
- }, [selectedFields, pickupType, dispTaxonomies]);
247
- };
package/src/DateElm.js DELETED
@@ -1,354 +0,0 @@
1
- import { __ } from "@wordpress/i18n";
2
- import { nanoid } from "nanoid";
3
- import {
4
- PanelBody,
5
- PanelRow,
6
- __experimentalNumberControl as NumberControl,
7
- } from "@wordpress/components";
8
-
9
- import { useRef, useEffect, useState } from "@wordpress/element";
10
-
11
- //Google Calender APIから祝日データを取得するためのID
12
- const CALENDAR_ID = "japanese__ja@holiday.calendar.google.com";
13
-
14
- //期間の設定から選択できる月の情報オブジェクトを配列にする関数
15
- export const generateDateArray = (dateObj, isMonth) => {
16
- const { startYear, startMonth, endYear, endMonth } = dateObj;
17
- const result = [];
18
-
19
- for (let year = startYear; year <= endYear; year++) {
20
- if (isMonth) {
21
- const monthStart = year === startYear ? startMonth : 1;
22
- const monthEnd = year === endYear ? endMonth : 12;
23
-
24
- for (let month = monthStart; month <= monthEnd; month++) {
25
- const unitObj = {
26
- id: nanoid(5),
27
- value: `${year}/${month.toString().padStart(2, "0")}`,
28
- label: `${year}/${month.toString().padStart(2, "0")}`,
29
- classname: "filter_date",
30
- };
31
- result.push(unitObj);
32
- }
33
- } else {
34
- const unitObj = {
35
- id: nanoid(5),
36
- value: `${year}`,
37
- label: `${year}`,
38
- classname: "filter_date",
39
- };
40
- result.push(unitObj);
41
- }
42
- }
43
-
44
- return result;
45
- };
46
-
47
- //与えられた月から日付と曜日を要素とする配列を生成する
48
- export const generateMonthCalendar = (dateString, holidays = null) => {
49
- const [year, month] = dateString.split("/").map(Number);
50
- const date = new Date(year, month - 1, 1);
51
- const lastDay = new Date(year, month, 0).getDate();
52
-
53
- const calendar = [];
54
-
55
- for (let day = 1; day <= lastDay; day++) {
56
- date.setDate(day);
57
- //祝日の情報
58
- const holidayItem = holidays?.find((item) => {
59
- // 日付文字列から最後の2桁を抽出
60
- const lastTwoDigits = parseInt(item.date.slice(-2), 10);
61
- // 抽出した2桁を比較
62
- return lastTwoDigits === day;
63
- });
64
- //日付情報オブジェクト
65
- const dayObj = holidayItem
66
- ? {
67
- date: day,
68
- weekday: date.getDay(),
69
- holiday: holidayItem.name,
70
- }
71
- : {
72
- date: day,
73
- weekday: date.getDay(),
74
- };
75
- calendar.push(dayObj);
76
- }
77
-
78
- return calendar;
79
- };
80
-
81
- //期間設定のインスペクターコントロール
82
- export const PeriodCtrl = ({
83
- startYear,
84
- endYear,
85
- dateSpan,
86
- isMonth,
87
- onChange,
88
- }) => {
89
- return (
90
- <PanelBody
91
- title={__("Period Setting", "block-collections")}
92
- initialOpen={true}
93
- className="form_setteing_ctrl"
94
- >
95
- <label>{__("Start of period", "block-collections")}</label>
96
- <PanelRow className="itmar_date_span">
97
- <NumberControl
98
- label={__("Year", "block-collections")}
99
- labelPosition="side"
100
- max={endYear}
101
- min={startYear}
102
- onChange={(newValue) => {
103
- const newSpanObj = {
104
- dateSpan: {
105
- ...dateSpan,
106
- startYear: Number(newValue),
107
- },
108
- };
109
- onChange(newSpanObj);
110
- }}
111
- value={dateSpan.startYear}
112
- />
113
- {isMonth && (
114
- <NumberControl
115
- label={__("Month", "block-collections")}
116
- labelPosition="side"
117
- max={12}
118
- min={1}
119
- onChange={(newValue) => {
120
- const newSpanObj = {
121
- dateSpan: {
122
- ...dateSpan,
123
- startMonth: Number(newValue),
124
- },
125
- };
126
- onChange(newSpanObj);
127
- }}
128
- value={dateSpan.startMonth}
129
- />
130
- )}
131
- </PanelRow>
132
- <label>{__("End of period", "block-collections")}</label>
133
- <PanelRow className="itmar_date_span">
134
- <NumberControl
135
- label={__("Year", "block-collections")}
136
- labelPosition="side"
137
- max={endYear}
138
- min={startYear}
139
- onChange={(newValue) => {
140
- const newSpanObj = {
141
- dateSpan: {
142
- ...dateSpan,
143
- endYear: Number(newValue),
144
- },
145
- };
146
- onChange(newSpanObj);
147
- }}
148
- value={dateSpan.endYear}
149
- />
150
- <NumberControl
151
- label={__("Month", "block-collections")}
152
- labelPosition="side"
153
- max={12}
154
- min={1}
155
- onChange={(newValue) => {
156
- const newSpanObj = {
157
- dateSpan: {
158
- ...dateSpan,
159
- endMonth: Number(newValue),
160
- },
161
- };
162
- onChange(newSpanObj);
163
- }}
164
- value={dateSpan.endMonth}
165
- />
166
- </PanelRow>
167
- </PanelBody>
168
- );
169
- };
170
-
171
- //日付から期間のクエリー用の配列を生成
172
- export const getPeriodQuery = (dateString) => {
173
- if (!dateString) {
174
- return null; //与えられた文字列が空ならnullをかえす
175
- }
176
- const parts = dateString.split("/");
177
- const year = parseInt(parts[0], 10);
178
- const month = parts.length > 1 ? parseInt(parts[1], 10) : null;
179
- const day = parts.length > 2 ? parseInt(parts[2], 10) : null;
180
-
181
- let startDate, endDate;
182
-
183
- if (day) {
184
- // 特定の日
185
- startDate = new Date(year, month - 1, day, 0, 0, 0, -1);
186
- endDate = new Date(year, month - 1, day, 23, 59, 59, 1000);
187
- } else if (month) {
188
- // 特定の月
189
- startDate = new Date(year, month - 1, 1, 0, 0, 0, -1);
190
- endDate = new Date(year, month, 1, 0, 0, 0, 0);
191
- } else {
192
- // 特定の年
193
- startDate = new Date(year, 0, 1, 0, 0, 0, -1);
194
- endDate = new Date(year + 1, 0, 1, 0, 0, 0, 0);
195
- }
196
-
197
- return {
198
- after: startDate.toISOString(),
199
- before: endDate.toISOString(),
200
- };
201
- };
202
-
203
- //本日の日付から'YYYY/MM'形式の日付文字列を生成する
204
- export const getTodayYearMonth = () => {
205
- const today = new Date();
206
- const year = today.getFullYear();
207
- const month = String(today.getMonth() + 1).padStart(2, "0");
208
- return `${year}/${month}`;
209
- };
210
- //本日の日付から年を返す
211
- export const getTodayYear = () => {
212
- const today = new Date();
213
- return today.getFullYear();
214
- };
215
- //本日の日付から月を返す
216
- export const getTodayMonth = () => {
217
- const today = new Date();
218
- return today.getMonth() + 1;
219
- };
220
-
221
- /* ------------------------------
222
- カレンダー用グリッドAreasの生成関数
223
- ------------------------------ */
224
- const week = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"];
225
- export const generateGridAreas = (firstDayOfMonth, totalDays, isMonday) => {
226
- let areas = [];
227
- let currentDay = 1;
228
- //月曜日を先頭に持ってくる場合の係数
229
- const mondayFirstDay = firstDayOfMonth - 1 < 0 ? 6 : firstDayOfMonth - 1;
230
- //先頭曜日の選択
231
- const modifyFirstDay = isMonday ? mondayFirstDay : firstDayOfMonth;
232
-
233
- //曜日ラベル
234
- let weekLabels = [];
235
- let week_index;
236
- for (let i = 0; i < 7; i++) {
237
- week_index = isMonday ? i + 1 : i; //月曜日を先頭に持ってくる場合の補正
238
- if (week_index > 6) week_index = 0;
239
- weekLabels.push(week[week_index]);
240
- }
241
- areas.push(weekLabels.join(" "));
242
-
243
- for (let i = 0; i < 6; i++) {
244
- // 6週分のループ
245
- let week = [];
246
- for (let j = 0; j < 7; j++) {
247
- // 1週間の7日分のループ
248
- if ((i === 0 && j < modifyFirstDay) || currentDay > totalDays) {
249
- week.push(`empty${i}`);
250
- } else {
251
- week.push(`day${currentDay}`);
252
- currentDay++;
253
- }
254
- }
255
- if (i == 5) {
256
- //最後の週
257
- week[5] = "day_clear";
258
- week[6] = "day_clear";
259
- }
260
- areas.push(week.join(" "));
261
- }
262
- return areas.map((week) => `"${week}"`).join("\n");
263
- };
264
-
265
- export const JapaneseHolidays = async (apiKey, targetMonth) => {
266
- //Google API Client Libraryをプロジェクトに追加する(非同期で読み込み)
267
- const loadGoogleAPI = () => {
268
- return new Promise((resolve, reject) => {
269
- //window.gapi の存在を直接チェック
270
- if (window.gapi) {
271
- resolve();
272
- return;
273
- }
274
-
275
- const script = document.createElement("script");
276
- script.src = "https://apis.google.com/js/api.js";
277
- script.async = true;
278
- script.defer = true;
279
- //スクリプトがロードされたときのイベントハンドラ
280
- script.onload = () => {
281
- // gapiがロードされるまでチェックを繰り返す
282
- const checkGapi = () => {
283
- if (window.gapi) {
284
- resolve();
285
- } else {
286
- setTimeout(checkGapi, 20); // Check again after 20ms
287
- }
288
- };
289
- checkGapi();
290
- };
291
-
292
- script.onerror = () =>
293
- reject(new Error("Failed to load Google API script"));
294
-
295
- // Check if the script is already in the document
296
- if (
297
- !document.querySelector(
298
- 'script[src="https://apis.google.com/js/api.js"]'
299
- )
300
- ) {
301
- document.body.appendChild(script);
302
- }
303
- });
304
- };
305
- //APIキーを使用してクライアントを初期化する
306
- const initClient = async () => {
307
- if (!window.gapi) {
308
- throw new Error("Google API not loaded");
309
- }
310
-
311
- // Check if gapi.client is already available
312
- if (!window.gapi.client) {
313
- // If not, load the client module
314
- await new Promise((resolve) => window.gapi.load("client", resolve));
315
- }
316
-
317
- if (window.gapi.client.calendar) {
318
- return;
319
- }
320
- await window.gapi.client.init({
321
- apiKey: apiKey,
322
- discoveryDocs: [
323
- "https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest",
324
- ],
325
- });
326
- };
327
- //祝日データの取得
328
- const fetchHolidays = async () => {
329
- const periodObj = getPeriodQuery(targetMonth);
330
-
331
- const response = await window.gapi.client.calendar.events.list({
332
- calendarId: CALENDAR_ID,
333
- timeMin: periodObj.after,
334
- timeMax: periodObj.before,
335
- singleEvents: true,
336
- orderBy: "startTime",
337
- });
338
-
339
- const events = response.result.items;
340
- return events.map((event) => ({
341
- date: event.start.date,
342
- name: event.summary,
343
- }));
344
- };
345
-
346
- try {
347
- await loadGoogleAPI();
348
- await initClient();
349
- return await fetchHolidays();
350
- } catch (error) {
351
- console.error("エラーが発生しました:", error);
352
- throw error;
353
- }
354
- };