Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UI: update to match style of MB CPT #113

Open
wants to merge 473 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
473 commits
Select commit Hold shift + click to select a range
571df04
Don't pass groupData
rilwis Dec 11, 2024
2d3a927
Fix error adding new groups
rilwis Dec 11, 2024
51adde1
Shorten useList style
rilwis Dec 11, 2024
0d664cb
Create getAllFields function and use it for conditional logic
rilwis Dec 11, 2024
4fc31a4
Use getAllFields for address field
rilwis Dec 11, 2024
f6a189e
Use getAllFields for admin columns
rilwis Dec 11, 2024
e804e2e
Do not use useFieldIds hook in ThemeCode
rilwis Dec 12, 2024
fec3b1c
Use getAllFields for group title
rilwis Dec 12, 2024
bd11ce3
Remove useFields hook
rilwis Dec 12, 2024
b1f57bc
Add updateField
rilwis Dec 12, 2024
0704b18
Fix error duplicating a group
rilwis Dec 12, 2024
98799da
Use useLists for updating ID
rilwis Dec 12, 2024
36e7493
Make update for field components not require id
rilwis Dec 12, 2024
e5ce886
Sync HeaderLabel and Name
rilwis Dec 12, 2024
a18bb01
Fix auto generating ID not working
rilwis Dec 12, 2024
aedf034
Use updateField for group title
rilwis Dec 12, 2024
e6f8ec8
Remove useFieldNameId & useFieldIds hooks
rilwis Dec 12, 2024
bcbf75d
Replace useFieldData with updateField
rilwis Dec 13, 2024
b4aa248
Remove useFieldData
rilwis Dec 13, 2024
8f6422b
Write in 1 line
rilwis Dec 13, 2024
00f9fda
Extract group add new field into a component
rilwis Dec 13, 2024
999839a
Simplify inserter
rilwis Dec 13, 2024
1f8bacf
Remove clsx
rilwis Dec 13, 2024
8930768
Replace updateFieldData with updateField
rilwis Dec 13, 2024
485a9b1
Use MbbApp directly for DashiconPicker
rilwis Dec 13, 2024
faf3b94
Remove redundant props
rilwis Dec 13, 2024
3b9c28b
Use field._id instead of id to avoid confusion
rilwis Dec 13, 2024
51243e1
Fix updateField not creating new field object
rilwis Dec 13, 2024
4315fc7
Use memo(Node) to prevent re-render
rilwis Dec 13, 2024
c848926
Make live update for only specific settings
rilwis Dec 13, 2024
517d9b9
Show field type icon on the field settings panel
rilwis Dec 13, 2024
e10cdc7
Style default header icon for tab
rilwis Dec 13, 2024
5dbb7bd
Update todo
rilwis Dec 13, 2024
aff62f8
Fix header icon (dashicons) color
rilwis Dec 13, 2024
8754333
Fix useToggle not working with admin columns
rilwis Dec 13, 2024
0683247
Highlight active field
rilwis Dec 13, 2024
6cda4dc
Change id to listId for clarity
rilwis Dec 13, 2024
9c2c95e
Fix not saving sub-fields
rilwis Dec 13, 2024
977e68a
Extract add field content into a component to be re-used
rilwis Dec 13, 2024
13ff672
Create a modal to add a new field
rilwis Dec 14, 2024
0d3696b
Add a dropdown menu for field actions
rilwis Dec 14, 2024
c2598df
Shorten actions into a fieldActions
rilwis Dec 14, 2024
d84657b
Add before/after actions
rilwis Dec 14, 2024
8cb8a23
Make duplicate/remove work in the dropdown menu
rilwis Dec 14, 2024
a9bdade
Extract actions into a component and make insert before/after works
rilwis Dec 14, 2024
fcf303d
Rename params for consistency
rilwis Dec 14, 2024
070dbd0
Update set active field when click the header bar
rilwis Dec 14, 2024
6e26353
Set active sidebar panel & field when add/remove a field
rilwis Dec 14, 2024
a41a2d6
Done add sub-field at the beginning/end
rilwis Dec 14, 2024
46391aa
Done action move up/down
rilwis Dec 14, 2024
4bf0c13
Merge pull request #117 from wpmetabox/field-actions
rilwis Dec 14, 2024
eb83e80
Fix react select dropdown hidden
rilwis Dec 14, 2024
fc6327c
Create and style context menu
rilwis Dec 16, 2024
fc9e3a4
Fix context menu actions not working
rilwis Dec 16, 2024
4eb1542
Fix position when clicking sub-element in the header
rilwis Dec 16, 2024
cc13dba
Merge pull request #118 from wpmetabox/context-menu
rilwis Dec 16, 2024
ea208f2
Remove field inserter
rilwis Dec 16, 2024
ae9d107
Move components to Structructure
rilwis Dec 16, 2024
220c157
Move components to Sidebar/FieldSettings
rilwis Dec 16, 2024
a23fb9a
Merge pull request #116 from wpmetabox/add-field-panel
rilwis Dec 16, 2024
e93cb34
Extract css for react-select
rilwis Dec 16, 2024
32e2794
Move css for gutenberg
rilwis Dec 16, 2024
a9a6eda
Remove react-tabs
rilwis Dec 16, 2024
fc32250
Remove collapsible CSS
rilwis Dec 16, 2024
2158419
Fix height of dropdown menu button
rilwis Dec 16, 2024
0308411
Rename files
rilwis Dec 16, 2024
2b69167
Update todo
rilwis Dec 16, 2024
1727bfc
Reset CSS for settings page & relationships
rilwis Dec 16, 2024
910da96
Update rule build css
rilwis Dec 16, 2024
77e2c8b
Add built files
rilwis Dec 16, 2024
028d9ec
Remove built files
rilwis Dec 16, 2024
c20105f
Allow to toggle sidebar when clicking top buttons
rilwis Dec 16, 2024
f6f519c
Allow to toggle field settings panel
rilwis Dec 16, 2024
12cb7db
Remove built css
rilwis Dec 16, 2024
7f7eb28
Simplify output when there are no fields
rilwis Dec 16, 2024
0c31b17
Clone Structure folder to Editor
rilwis Dec 16, 2024
66c7245
Remove redundant addField
rilwis Dec 16, 2024
e7479f4
Move hidden inputs for _id & type to FieldSettings
rilwis Dec 16, 2024
a449a7d
Make Group use Field to edit
rilwis Dec 16, 2024
9524c2e
Add preview for Text
rilwis Dec 16, 2024
a08f480
Style field label
rilwis Dec 16, 2024
7c7392f
Fix context menu if parent not found
rilwis Dec 16, 2024
1755498
Fix clicking field controls close the field settings panels
rilwis Dec 16, 2024
33d7132
Preview text field
rilwis Dec 16, 2024
b28151f
Update TODO
rilwis Dec 16, 2024
c9c1cbe
Enqueue Meta Box assets to ensure preview is nice
rilwis Dec 16, 2024
9f0241a
Fix clone button displayed inline with input when size is entered
rilwis Dec 16, 2024
edf2c1d
Make clone_empty_start preview work
rilwis Dec 16, 2024
00abee4
Make prepend, append preview work
rilwis Dec 16, 2024
c23d22f
Extract enqueuing assets into a class to be able to enqueue extension…
rilwis Dec 16, 2024
3b39c4f
Make text limiter preview work
rilwis Dec 16, 2024
d6a99f5
Fix style for input & select in input-group
rilwis Dec 16, 2024
543bcef
Start to work on tooltip preview
rilwis Dec 16, 2024
894e0ba
Remove inserter css
rilwis Dec 17, 2024
867e6ce
Fix text limiter error when no data
rilwis Dec 17, 2024
87e8134
Update some clone settings up to field instead of locally
rilwis Dec 17, 2024
dff4b38
Make add clone button not clickable
rilwis Dec 17, 2024
44ec050
Show tooltip
rilwis Dec 17, 2024
ea33ebe
Live update tooltip content & icon
rilwis Dec 17, 2024
b62825d
Create a base template for field type preview
rilwis Dec 17, 2024
0e30420
Update text for clone empty start
rilwis Dec 17, 2024
3e9fbcd
Add preview for checkbox
rilwis Dec 17, 2024
795d497
Add preview for checkbox list
rilwis Dec 17, 2024
d35853f
Add cursor
rilwis Dec 17, 2024
7368383
Fix checkbox list options empty show 1 checkbox
rilwis Dec 17, 2024
c64e5e7
Add preview for radio
rilwis Dec 17, 2024
942036e
Extract getOptions to a helper function
rilwis Dec 17, 2024
bd2330a
Radio std is always single
rilwis Dec 17, 2024
cb7ee2a
Add preview for select
rilwis Dec 17, 2024
ed84d3f
Disable inputs for button & links
rilwis Dec 18, 2024
51272c1
Use value for select, not using selected prop
rilwis Dec 18, 2024
24b1b9e
Extract doNothing function
rilwis Dec 18, 2024
2c4ca31
Make std works for Text
rilwis Dec 18, 2024
b4aed60
Add preview for Textarea
rilwis Dec 18, 2024
db5b9d2
Tooltip: fix "A component is changing an uncontrolled input to be con…
rilwis Dec 18, 2024
27ffe57
Done autocomplete
rilwis Dec 18, 2024
a730f6b
Done button
rilwis Dec 18, 2024
eb30d3f
Do not show rwmb-label when no field.name
rilwis Dec 18, 2024
2816be2
Done button_group
rilwis Dec 18, 2024
14eda3f
Done color
rilwis Dec 18, 2024
92a70fd
Done custom html
rilwis Dec 18, 2024
dc83712
Done date
rilwis Dec 18, 2024
d0fcb84
Done datetime (not preview std time)
rilwis Dec 18, 2024
f6c9ffe
Fix preview for time for datetime
rilwis Dec 18, 2024
df0d1b7
Done fieldset_text
rilwis Dec 18, 2024
c23b442
Fix missing API key for Google maps
rilwis Dec 18, 2024
652864e
Done map
rilwis Dec 18, 2024
2c2bc82
Done hidden field
rilwis Dec 18, 2024
d9cc95e
Done icon
rilwis Dec 19, 2024
8193672
Done image select
rilwis Dec 19, 2024
3e692b6
Done key value
rilwis Dec 21, 2024
5611e9f
Done oembed
rilwis Dec 21, 2024
d3cbf60
Done OSM
rilwis Dec 21, 2024
12e03d8
Fix react warning for value prop of controlled input
rilwis Dec 21, 2024
3a24e18
Done password (extend from text)
rilwis Dec 21, 2024
3c3763e
Add feedback
rilwis Dec 22, 2024
d173a69
Simplify enqueue assets for datetimepicker
rilwis Dec 22, 2024
7f6e8fa
Done select advanced
rilwis Dec 22, 2024
e99070e
Add notes
rilwis Dec 22, 2024
0fbf73d
Done slider
rilwis Dec 22, 2024
be3983b
Use textarea auto size
rilwis Dec 22, 2024
9f8b00f
Close sidebar when clicking empty areas
rilwis Dec 22, 2024
09c1c7d
Fix clicking sidebar closes sidebar
rilwis Dec 23, 2024
893a19b
Done switch
rilwis Dec 23, 2024
28c8767
Done text list
rilwis Dec 23, 2024
6c7c146
Done time
rilwis Dec 23, 2024
25f8088
Fix not showing preprend, append for datetime fields
rilwis Dec 23, 2024
fcdc80c
Done editor
rilwis Dec 23, 2024
a492285
Better check for click to close sidebar
rilwis Dec 23, 2024
d7cf707
Done email + url
rilwis Dec 23, 2024
aec01c3
Update icon for email field
rilwis Dec 23, 2024
ccc80ec
Done number
rilwis Dec 23, 2024
ea9ac81
Done range
rilwis Dec 23, 2024
7016b37
First try for post field
rilwis Dec 23, 2024
4b0842c
Done post field
rilwis Dec 23, 2024
f331db6
Extract object field
rilwis Dec 23, 2024
ccee1de
Done taxonomy, tax_advanced, user
rilwis Dec 23, 2024
df65653
Fix dependency for object field's toggle all
rilwis Dec 23, 2024
9d8285e
Done file & image
rilwis Dec 23, 2024
bae8b4b
Done file_advanced
rilwis Dec 23, 2024
fb15383
Done file input
rilwis Dec 23, 2024
1eba80b
Done file upload
rilwis Dec 23, 2024
b15049a
Done image advanced
rilwis Dec 23, 2024
ac02ab8
Done image upload & single image
rilwis Dec 23, 2024
cce97e3
Done video
rilwis Dec 23, 2024
ca5cdf5
Make max_status works for file upload
rilwis Dec 23, 2024
ccf7466
Done divider
rilwis Dec 23, 2024
22cd570
Done heading
rilwis Dec 23, 2024
cabb833
First try to show sub-fields in groups
rilwis Dec 24, 2024
98b2443
Fix not showing 2 context menus when clicking on sub-fields
rilwis Dec 24, 2024
1da41c1
Make able to select sub-field
rilwis Dec 24, 2024
5f6be27
Fix context menu under by sidebar
rilwis Dec 24, 2024
c78dddf
Style remove button in the context menu
rilwis Dec 24, 2024
1fb78d3
Use portale for context menu to be able to hover items for subfields
rilwis Dec 24, 2024
a7c4fc9
Improve css for hover/select subfields. See 1da41c19c14305a718be05226…
rilwis Dec 24, 2024
3ee92a0
Re-add the inserter button when no fields
rilwis Dec 24, 2024
c4a2bea
Re-add the inserter button for empty groups
rilwis Dec 24, 2024
f090201
Do not show the clone button if the group has no subfields.
rilwis Dec 24, 2024
c4512cf
Do not show field before/after if no content
rilwis Dec 24, 2024
5602d4c
Style position of action bar
rilwis Dec 24, 2024
8ed93db
Use icons only for toolbar
rilwis Dec 24, 2024
dd77ac2
Fix icon style in context menu
rilwis Dec 24, 2024
8b9035f
Move action bar to the Node
rilwis Dec 24, 2024
2a052f1
Update height of toolbar buttons
rilwis Dec 25, 2024
1a7f28d
Differentiate background for subfields
rilwis Dec 25, 2024
66a489c
Fix context menu position
rilwis Dec 25, 2024
7856631
Show toolbar only when the field is active
rilwis Dec 25, 2024
8d75594
Use z-index to make sure the active field is on top of other fields.
rilwis Dec 25, 2024
44fbeea
Make active subfields different
rilwis Dec 25, 2024
d29acf5
Make subfield label editable
rilwis Dec 25, 2024
9d51d53
Remove some header components
rilwis Dec 25, 2024
2c36611
Change icons for add subfields
rilwis Dec 25, 2024
6515411
Fix toggle group can't change
rilwis Dec 25, 2024
760d25e
Don't use background when hover, to make it less confused with collap…
rilwis Dec 25, 2024
6192f5d
Extract elements into components, and add normalizing fields
rilwis Dec 25, 2024
20957ca
Fix wrong extensions' CSS URLs
rilwis Dec 25, 2024
7e9b332
First try to output collapsible elements for groups
rilwis Dec 25, 2024
5c7038a
// Don't normalize field directly as it can fill the field settings i…
rilwis Dec 26, 2024
773d446
Fix group title not live changing
rilwis Dec 26, 2024
695367e
Fix missing columns settings
rilwis Dec 26, 2024
a0b42e0
Done tab
rilwis Dec 26, 2024
3924a36
Move tab icon settings to the general tab
rilwis Dec 26, 2024
708e524
Fix style tab image
rilwis Dec 26, 2024
351f9b5
Add todo
rilwis Dec 26, 2024
e7ed30c
Move _id, type settings to Node, to fix sorting issue
rilwis Dec 26, 2024
9535cfa
Make drag and drop works, re-add AddButton
rilwis Dec 26, 2024
e42d7ac
Make search input auto focus when openning modal
rilwis Dec 26, 2024
09808a6
Don't use portal for toolbar, use absolute positioning
rilwis Dec 26, 2024
4e822a6
Style empty group subfields
rilwis Dec 26, 2024
1fe438d
Done background
rilwis Dec 26, 2024
df09409
Ensure toolbar is above the field outline when hovering (1 is enough).
rilwis Dec 26, 2024
926f7ca
Do not show field settings when click to edit field label
rilwis Dec 26, 2024
a0f140c
Move post_name to field group settings summary, remove logo
rilwis Dec 26, 2024
93ac534
Remove add field panel from right sidebar
rilwis Dec 26, 2024
475dcdb
First try to add nav on the left
rilwis Dec 26, 2024
9f1e357
Update header with actions for toggle panels
rilwis Dec 27, 2024
bb837f0
Style nav panel
rilwis Dec 27, 2024
e740c53
Move structure folder to inside Nav
rilwis Dec 27, 2024
e70c255
Add code to show nav fields
rilwis Dec 27, 2024
ea4b040
Fix relative path for imports
rilwis Dec 27, 2024
e7a5a8d
Remove header icon, id, label components
rilwis Dec 27, 2024
56b3645
Remove field settings for structure panel
rilwis Dec 27, 2024
1a1b538
Style field structure
rilwis Dec 27, 2024
4d40894
Add instructions for group when no fields
rilwis Dec 27, 2024
d012442
Fix outline issue with group title
rilwis Dec 27, 2024
52ef482
Update todo & text
rilwis Dec 27, 2024
2cf0475
Continue fix for outline issue with group title. d01244203be92ca98169…
rilwis Dec 27, 2024
2a47dde
Allow to duplicate the whole group
rilwis Dec 28, 2024
93a77fa
Show field ID in the field inserter for conditional logic, admin colu…
rilwis Dec 28, 2024
ea61d56
Fix style include exclude
rilwis Dec 28, 2024
e78ccf4
Drag fields from Add Field panel
rilwis Dec 28, 2024
da2674e
Update params for nav list
rilwis Dec 28, 2024
3fb72ac
Add built files
rilwis Dec 28, 2024
a74be2d
Merge pull request #119 from wpmetabox/editor
rilwis Dec 28, 2024
a0f177c
Add built files
rilwis Dec 30, 2024
cdf1415
Merge branch 'editor' into ui
rilwis Dec 30, 2024
f730052
Remove admin footer, which causes CSS issues.
rilwis Jan 13, 2025
b35df18
Always shows summary
rilwis Jan 15, 2025
69d018c
Always show field group settings panel as default
rilwis Jan 15, 2025
512c484
Style the add field panel to be more compact
rilwis Jan 15, 2025
fa353f4
Jump to active field (still jumppy)
rilwis Jan 15, 2025
b1d3739
Update todo
rilwis Jan 15, 2025
0e14608
Add built files
rilwis Jan 15, 2025
d765084
Change the version to 5.0.0-alpha
rilwis Jan 16, 2025
9b8ae61
Fix toolbar under hover outline
rilwis Jan 20, 2025
a7bb069
Differentiate hover vs active: hover has outline, active has background
rilwis Jan 20, 2025
b8aecd8
Always open settings panel
rilwis Jan 27, 2025
563f641
Keep categories when searching fields
rilwis Jan 28, 2025
0416475
Show field id in the structure panel with click to copy
rilwis Jan 28, 2025
917037f
Update the style of hovering
rilwis Jan 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
59 changes: 59 additions & 0 deletions TODO
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
[ ] Chuyển settings của field group sang sidebar
[ ] Kiểm tra khi settings có thì open panel: Tạm thời để sau...
[ ] Chuyển settings của fields sang sidebar
[ ] Làm indicator cho các panel, tức là khi có settings thay đổi so với default thì có indicator để nhận diện

Preview:

[ ] Column

[ ] Switch to field khi có trường required chưa điền
[ ] Object field, chuyển chọn field type thành icon

[ ] Update UI for creating settings pages
[ ] Update UI for creating relationships
[ ] Xoá react tabs
[ ] Xóa phần collapsible, bao gồm cả CSS

Feedback:

[ ] Thay đổi field type
[ ] icon mở sidebar setting của field group cũng khó nhìn

## Settings của field group:

- Settings được lấy từ biến MbbApp.settings và có thể truyền qua URL (trong trường hợp muốn tự setup settings cho 1 post type khi vừa mới tạo xong)
- Các settings lấy và update từ hook `useSettings`. Một số setting được dùng chung trong các component như sau:
- prefix: để lấy đúng ID (bao gồm cả prefix) của các field text gợi ý. Được dùng trong các component:
+ `AddressField`
+ `FieldInserter` (admin columns, conditional logic)
+ `GroupTitle`
- `object_type`: để lấy object type dùng trong các component dưới:
+ `Sidebar`
+ `Location`
+ `IncludeExclude`
+ `ShowHide`
+ `AdminColumnsPosition`
- `post_types`: để lấy post types được chọn cho các component dưới:
+ `Location`
+ `Post`
+ `IncludeExclude`
- Các settings sẽ được hiển thị ở sidebar, chia thành các panel. Các extensions khi được cài cũng sẽ tạo ra các panel của riêng chúng.
- Mặc định thì có các panel sau là mở: summary, location, settings (dành cho post), block settings

## Settings của fields

- Phần settings của field sẽ được hiện ở sidebar, trong panel `EditFieldSettingsPanel`. Trong panel này sẽ hiện tất cả các settings của các field (do dùng uncontrolled form nên buộc phải có các input trong DOM).
- Panel này chứa 1 div để làm portal cho các field. Mỗi field sẽ tách làm 2 phần, 1 phần preview ở phần main và 1 phần edit settings nằm trong portal.
- Khi lựa chọn 1 field ở vùng main thì
- Lưu unique ID của field đó vào trong hook `useEditFieldSettingsPanel`
- Thêm class để hiển thị settings của field đó trong panel
- Setup sidebar hiện panel `EditFieldSettingsPanel`. Do phần ẩn hiện sidebar panel này được sử dụng khi chọn 1 field, nên id của sidebar panel và action ẩn hiện được đưa vào hook `useSidebarPanel`.

## Danh sách fields

- Do sử dụng library SortableJS nên cần phải tạo nhiều list để chứa các field. Mỗi 1 group sẽ là 1 list, và có 1 list là root, chứa các field root.
- Sử dụng `useLists` hook để truy xuất đến các list này ở mọi nơi (globally), khác với cách dùng `useFields` trước đây, chỉ dùng cục bộ.
- Khi cần sử dụng các hàm CRUD cho từng list, gọi qua hàm `getForList`.
- Do lưu tất cả các field vào đây, nên có thể lấy danh sách tất cả các field, thay thế cho hook `useFieldIds` trước đây. Vì có thể lấy đủ thông tin, nên các phần suggestion trong `<FieldInserter>` của group title, address, conditional logic, ... có thể hiện tên field và khi chọn thì điền ID của field.
- Các update về field như name/id/label hoặc icon thông qua các hook cũ `useFieldData` hoặc `useFieldNameId` đều bỏ, thay thế bằng `updateField`.
155 changes: 83 additions & 72 deletions app/App.js
Original file line number Diff line number Diff line change
@@ -1,85 +1,96 @@
import { render, useContext, useEffect } from "@wordpress/element";
import { render } from "@wordpress/element";
import { __ } from "@wordpress/i18n";
import { Icon, category, cog } from "@wordpress/icons";
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs';
import Fields from './components/Tabs/Fields';
import Result from './components/Tabs/Result';
import Settings from './components/Tabs/Settings';
import ThemeCode from "./components/Tabs/ThemeCode";
import { ErrorBoundary } from "react-error-boundary";
import { SettingsContext, SettingsProvider } from "./contexts/SettingsContext";
import Header from './components/Header';
import Main from './components/Main';
import Nav from "./components/Nav";
import Sidebar from './components/Sidebar';
import useFieldSettingsPanel from "./hooks/useFieldSettingsPanel";
import useSidebarPanel from "./hooks/useSidebarPanel";

const Root = () => {
const forceValidate = () => document.querySelector( '#post' ).removeAttribute( 'novalidate' );
const Layout = ( { children } ) => {
const { setSidebarPanel } = useSidebarPanel();
const { setActiveField } = useFieldSettingsPanel();

useEffect( () => {
const publishButton = document.querySelector( '#publish' );
const saveButton = document.querySelector( '#save-post' );
if ( publishButton ) {
publishButton.addEventListener( 'click', forceValidate );
const hideSidebar = e => {
if ( !e.target.classList.contains( 'mb-body__inner' ) ) {
return;
}
if ( saveButton ) {
saveButton.addEventListener( 'click', forceValidate );
}

// Don't submit form when press Enter.
jQuery( '#post' ).on( 'keypress keydown keyup', 'input', function ( e ) {
if ( e.keyCode == 13 ) {
e.preventDefault();
}
} );
}, [] );
setSidebarPanel( 'field_group_settings' );
setActiveField( {} );
};

return (
<SettingsProvider>
<App />
</SettingsProvider>
<ErrorBoundary fallback={ <p>{ __( 'Something went wrong. Please try again!', 'meta-box-builder' ) }</p> }>
<Header />

<div className="mb-body">
<Nav />

<div className="mb-body__inner" onClick={ hideSidebar }>
{ children }
</div>

<Sidebar />
</div >

<input type="hidden" name="post_status" value={ MbbApp.status || 'draft' } />
<input type="hidden" name="messages" value="" />
<input type="hidden" name="mbb_nonce" value={ MbbApp.nonce_save } />
</ErrorBoundary>
);
};

const App = () => {
const { settings } = useContext( SettingsContext );
const App = () => (
<Layout>
<Main />
</Layout>
);

return (
<>
<ErrorBoundary fallback={ <h2>{ __( 'Something went wrong. Please try again!', 'meta-box-builder' ) }</h2> }>
<Tabs forceRenderTabPanel={ true }>
<TabList className="react-tabs__tab-list og-tabs--main">
<Tab>
<Icon icon={ category } />
{ __( 'Fields', 'meta-box-builder' ) }
</Tab>
<Tab>
<Icon icon={ cog } />
{ __( 'Settings', 'meta-box-builder' ) }
</Tab>
<Tab className="button button-small">{ __( 'Get PHP Code', 'meta-box-builder' ) }</Tab>
</TabList>
<TabPanel>
<Fields fields={ MbbApp.fields } />
</TabPanel>
<TabPanel className="react-tabs__tab-panel og-tab-panel--settings">
<Settings />
</TabPanel>
<TabPanel className="react-tabs__tab-panel og-tab-panel--settings">
<Result endPoint="generate" />
</TabPanel>
</Tabs>
<br />
{
MbbApp.fields.length > 0 && settings.object_type !== 'block' &&
<div className="postbox og-theme-code">
<div className="postbox-header">
<h2 className="hndle ui-sortable-handle">{ __( "Theme code", "meta-box-builder" ) }</h2>
</div>
<div className="inside">
<ThemeCode settings={ settings } fields={ MbbApp.fields } />
</div>
</div>
}
</ErrorBoundary>
</>
);
const container = document.getElementById( 'poststuff' );
container.classList.add( 'mb' );
container.classList.add( 'og' );
container.id = 'mb-app';

// Use React 17 to avoid flashing issues when click to expand field settings.
render( <App />, container );
// const root = createRoot( container );
// root.render( <App /> );

// Remove .wp-header-end element to properly show notices.
document.querySelector( '.wp-header-end' ).remove();

const form = document.querySelector( '#post' );

// Force form to validate to force users to enter required fields.
// Use setTimeout because this attribute is dynamically added.
setTimeout( () => {
form.removeAttribute( 'novalidate' );
}, 100 );

// Prevent submit when press Enter.
const preventSubmitWhenPressEnter = e => {
if ( e.target.tagName === 'INPUT' && e.keyCode == 13 ) {
e.preventDefault();
}
};
form.addEventListener( 'keypress', preventSubmitWhenPressEnter );
form.addEventListener( 'keydown', preventSubmitWhenPressEnter );
form.addEventListener( 'keyup', preventSubmitWhenPressEnter );

// Set post status when clicking submit buttons.
form.addEventListener( 'submit', e => {
const submitButton = e.submitter;
const status = submitButton.dataset.status;
const originalStatus = document.querySelector( '#original_post_status' ).value;
if ( originalStatus !== status ) {
document.querySelector( '[name="messages"]' ).setAttribute( 'name', MbbApp.status !== 'publish' ? 'publish' : 'save' );
}
if ( originalStatus === 'auto-draft' && status === 'draft' ) {
document.querySelector( '[name="messages"]' ).setAttribute( 'name', 'save' );
}

render( <Root />, document.getElementById( 'root' ) );
submitButton.disabled = true;
submitButton.setAttribute( 'value', MbbApp.saving );
document.querySelector( '[name="post_status"]' ).setAttribute( 'value', status );
} );
68 changes: 68 additions & 0 deletions app/components/AddFieldContent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { Button, SearchControl } from '@wordpress/components';
import { useState } from '@wordpress/element';
import { ReactSortable } from 'react-sortablejs';
import { getFieldIcon } from '../functions';
import useApi from "../hooks/useApi";

const AddFieldContent = ( { className = '', addField, onSelect } ) => {
const [ searchQuery, setSearchQuery ] = useState( '' );

return (
<div className={ `og-add-field ${ className }` }>
<SearchControl value={ searchQuery } onChange={ setSearchQuery } __nextHasNoMarginBottom />
<Categories searchQuery={ searchQuery } onSelect={ onSelect } addField={ addField } />
</div>
);
};

const Categories = props => {
const fieldCategories = useApi( 'field-categories', [] );
return fieldCategories.map( category => <Category key={ category.slug } category={ category } { ...props } /> );
};

const Category = ( { category, searchQuery, onSelect, addField } ) => {
const fieldTypes = useApi( 'field-types', {} );
const fields = Object.entries( fieldTypes ).filter( ( [ type, field ] ) => field.category === category.slug && field.title.toLowerCase().includes( searchQuery.toLowerCase() ) );

return fields.length &&
<>
<div className="og-add-field__title">{ category.title }</div>
<FieldList fields={ fields } onSelect={ onSelect } addField={ addField } />
</>;
};

const FieldList = ( { fields, onSelect, addField } ) => (
<ReactSortable
className="og-add-field__list"
delay={ 0 }
delayOnTouchOnly={ false }
touchStartThreshold={ 0 }
group={ {
name: 'add',
pull: 'clone', // Ability to move from the list: give and keep a copy
put: false, // Do not allow to add from other lists
} }
sort={ false } // Do not sort
list={ Object.keys( fields ) }
setList={ () => {} } // Do nothing
>
{
fields.map( ( [ type, field ] ) =>
<div key={ type } data-type={ type } className="og-add-field__item">
<FieldButton type={ type } title={ field.title } onSelect={ onSelect } addField={ addField } />
</div>
)
}
</ReactSortable>
);

const FieldButton = ( { type, title, onSelect, addField } ) => {
const handleClick = () => {
addField( type );
onSelect && onSelect();
};

return <Button variant="tertiary" icon={ getFieldIcon( type ) } onClick={ handleClick }>{ title }</Button>;
};

export default AddFieldContent;
27 changes: 27 additions & 0 deletions app/components/Editor/AddFieldButton.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Button, Modal } from "@wordpress/components";
import { useState } from "@wordpress/element";
import { __ } from "@wordpress/i18n";
import AddFieldContent from "../AddFieldContent";

const AddFieldButton = ( { addField, variant = 'primary', text = __( '+ Add Field', 'meta-box-builder' ) } ) => {
const [ isOpen, setOpen ] = useState( false );
const openModal = () => setOpen( true );
const closeModal = () => setOpen( false );

return (
<div className="mb-editor__add-field-button">
<Button variant={ variant } onClick={ openModal } title={ __( 'Add a new field', 'meta-box-builder' ) }>
{ text }
</Button>
{
isOpen && (
<Modal focusOnMount="firstContentElement" title={ __( 'Add a new field', 'meta-box-builder' ) } size="large" onRequestClose={ closeModal }>
<AddFieldContent addField={ addField } onSelect={ closeModal } />
</Modal>
)
}
</div>
);
};

export default AddFieldButton;
Loading