รวม
หากมีการบันทึกการเปลี่ยนอื่นระหว่างที่คุณแก้ไข ให้รวมทั้งสองฝ่ายโดยใช้รุ่นเริ่มต้นเป็นฐาน ทุกส่วนที่รวมอัตโนมัติได้จะถูกใช้ตั้งแต่แรก เหลือเพียงส่วนซ้อนกันเป็นข้อขัดแย้ง นี่คือหน้าจออิสระของ nabi-note/merge ไม่ใช่ wing
| ซ้าย | กลาง | ขวา |
|---|---|---|
| รุ่นเมื่อเริ่มแก้ไข | เอกสารปัจจุบันของคุณหลังรวมอัตโนมัติ | รุ่นที่บันทึกขณะคุณแก้ไข |
| อ่านอย่างเดียว | แก้ไขโดยตรงได้ | อ่านอย่างเดียว |
ตรงกลางแก้ข้อความ รูปแบบ ตาราง รายการและภาพได้เหมือนตัวแก้ไขปกติ wing ที่ส่งมากำหนดความสามารถ เครื่องหมายขัดแย้งและสถานะการแก้ไม่ปนในเนื้อหาที่บันทึก
ตัวอย่างที่รวมอัตโนมัติได้ทั้งหมด
คุณเปลี่ยนเวลาประชุมเป็น 11 โมงเช้า อีกคนเปลี่ยนสถานที่เป็น ห้องประชุมชั้น 3 เพราะเปลี่ยนคนละย่อหน้า ผลตรงกลางจึงมีทั้งสองอย่าง
ไม่มีข้อขัดแย้งเหลือ จึงกด ยืนยัน ได้ทันที หรือปรับข้อความตรงกลางก่อนก็ได้ เอกสารสุดท้ายด้านล่างคือผลจริงที่ callback ยืนยันได้รับ
กำลังโหลด...
ตัวอย่างที่รวมอัตโนมัติได้บางส่วน
ครั้งนี้คุณเปลี่ยนเวลาเป็น 11 โมงเช้า อีกคนเป็น บ่าย 2 โมง การแก้ย่อหน้าเดียวกันต่างกันทำให้เวลายังขัดแย้ง ส่วนที่คุณเปลี่ยนผู้ดำเนินการเป็น จีมินและซอยอน และอีกคนเปลี่ยนสถานที่เป็น ห้องประชุมชั้น 3 จะใช้โดยอัตโนมัติ
แก้ข้อขัดแย้งด้วยวิธีใดวิธีหนึ่ง:
- ซ้าย >>: ใช้เนื้อหาส่วนนั้นจากรุ่นเริ่มต้น
- ขวา <<: ใช้เนื้อหาส่วนนั้นจากรุ่นที่เพิ่งบันทึก
- แก้ข้อขัดแย้งด้วยเนื้อหาปัจจุบัน: เก็บหรือแก้เนื้อหากลาง แล้วทำเครื่องหมายว่าแก้แล้ว
เปลี่ยนประโยคเวลาในกลางแล้วกด แก้ข้อขัดแย้งด้วยเนื้อหาปัจจุบัน ต้องแก้ข้อขัดแย้งทั้งหมดก่อนจึงยืนยันได้
กำลังโหลด...
การแก้บริเวณที่แก้ขัดแย้งแล้วจะรักษาสถานะไว้ เลิกทำการแก้ขัดแย้งจะย้อนสถานะด้วย ทำซ้ำจะคืนสถานะ การลบหรือแก้ข้อความเฉย ๆ ไม่ทำให้ข้อขัดแย้งที่ค้างถูกแก้อัตโนมัติ
กฎการรวมอัตโนมัติและข้อขัดแย้ง
เปรียบเทียบการเปลี่ยนจากเอกสารเริ่มต้นไปยังเอกสารคุณ และจากเริ่มต้นเดียวกันไปยังรุ่นใหม่ การเปลี่ยนฝ่ายเดียวหรือเหมือนกันทั้งสองฝ่ายจะใช้โดยอัตโนมัติ รวมถึงการเปลี่ยนคนละย่อหน้าหรือบรรทัด
เหมือนการรวมข้อความของ Git จะพิจารณาการซ้อนกันตามย่อหน้าและบรรทัด แม้เปลี่ยนคนละคำในบรรทัดเดียวกันก็ยังเป็นข้อขัดแย้ง การแทรกต่างกันตำแหน่งเดียวหรือแก้เนื้อหาที่อีกฝ่ายลบก็ต้องตัดสินใจเอง
หากสองฝ่ายแก้บล็อกมีโครงสร้าง เช่น ตาราง รายการหรือพื้นที่ลอยต่างกัน จะถือทั้งโครงสร้างเป็นข้อขัดแย้ง ไม่สุ่มผสมเซลล์หรือรายการ ให้เลือกเนื้อหาหรือแก้กลางเอง การย้ายและแก้ซ้อนกันที่ระบุตำแหน่งแน่ชัดไม่ได้ก็ไม่ใช้โดยอัตโนมัติ
เชื่อมหน้าจอรวมอิสระ
ส่ง NABI TREE JSON ที่บันทึกไว้หรือสตริง HTML ให้ base, local, incoming ใช้ wing และตัวเลือกเดียวกับตัวแก้ไขต้นฉบับ mountMerge() สร้างตัวแก้ไขกลาง แถบเครื่องมือ แหล่งข้อมูลสองข้าง เครื่องมือข้อขัดแย้ง และปุ่มยืนยัน
import { wings } from 'nabi-note'
import { mountMerge } from 'nabi-note/merge'
import 'nabi-note/nabi.css'
const merge = mountMerge({
root: document.querySelector('#merge')!,
base: editingStartedDocument,
local: myEditedDocument,
incoming: latestDocument,
wings: wings().allBasic().build(),
locale: 'th',
incomingVersion: latestVersion,
async onConfirm({ json, html, incomingVersion, signal }) {
return saveDocument({ json, html, expectedVersion: incomingVersion, signal })
},
onError(error) {
showError(error)
},
})onConfirm รับ JSON, HTML สำหรับเผยแพร่, revision การแก้ไข และ incomingVersion ของผลปัจจุบันที่แก้ข้อขัดแย้งหมดแล้ว คืน false จะไม่จบการยืนยัน ระหว่างรอ Promise จะห้ามแก้ เลือกข้อขัดแย้งและยืนยันซ้ำ ถอดหน้าจอจะยกเลิก signal ของผล ระหว่างประกอบอักษรเกาหลีด้วย IME ต้องรอจบก่อนยืนยัน
เชื่อมงานของบริการ เช่น เลือกภาพหรืออัปโหลดเหมือนตัวแก้ไขปกติ ส่งแผงเครื่องมือและงานโฮสต์ผ่าน toolbarOptions และตัวเลือกพื้นผิวแก้ไขผ่าน surfaceOptions
incomingVersion คืนค่าที่บริการส่งมาโดยไม่เปลี่ยน บริการต้องเทียบกับรุ่นล่าสุดบนเซิร์ฟเวอร์เมื่อบันทึก หากมีรุ่นใหม่บันทึกระหว่างรวม ให้โหลดเอกสารล่าสุดแล้วเริ่มรวมใหม่ อย่าเขียนผลเก่าทับ
อ่านสถานะหรือเรียกยืนยันจากนอกหน้าจอได้ด้วย
const stop = merge.session.onChange((state) => {
updateRemainingCount(state.unresolvedCount)
})
const canConfirm = merge.session.getState().canConfirm
const confirmed = await merge.confirm()
stop()
merge.unmount()อ่านผลด้วย merge.nabi.getJson() และ merge.nabi.getHtml() อย่าบันทึก DOM แก้ไขหรือ getEditorHtml() หากต้องการใช้เฉพาะเนื้อหาเก่าที่เลือกระหว่างสองรุ่น ใช้การรวมด้วยคลิกใน เปรียบเทียบ
ยืนยันหลังอัปโหลดเสร็จ
เชื่อม wing upload และ mountUpload() สำหรับปุ่มไฟล์ วางและลากวาง sendUpload ส่งไฟล์ไปเซิร์ฟเวอร์แล้วคืน { uri } ดูตัวอย่างการเชื่อมและแสดงความคืบหน้าเต็มที่ อัปโหลดไฟล์
ใช้ merge.session.hold() พักการยืนยันและเลือกข้อขัดแย้งระหว่างงานอะซิงโครนัส เช่น อัปโหลดที่ยังไม่เข้าเอกสาร เรียกฟังก์ชันที่คืนมาเมื่อเสร็จ ยกเลิกหรือถอดหน้าจอ ปลดพัก หลังแทรกในเอกสาร ไม่ใช่ทันทีที่ขึ้นเซิร์ฟเวอร์ เพื่อให้ไฟล์อยู่ในผลสุดท้าย
import { mountUpload, wings, type UploadMount } from 'nabi-note'
import { mountMerge } from 'nabi-note/merge'
let upload: UploadMount | undefined
let releaseUpload: (() => void) | undefined
const merge = mountMerge({
root,
base,
local,
incoming,
wings: wings().allBasic().use('upload').build(),
locale: 'th',
incomingVersion: latestVersion,
toolbarOptions: { onFiles: (files) => upload?.take(files) },
surfaceOptions: { fileSink: (files) => upload?.take(files) },
onConfirm: ({ json, html, incomingVersion, signal }) =>
saveDocument({ json, html, expectedVersion: incomingVersion, signal }),
})
upload = mountUpload({
nabi: merge.nabi,
root: merge.content,
locale: 'th',
uploader: sendUpload,
onStart() {
releaseUpload = merge.session.hold()
},
onDone() {
releaseUpload?.()
releaseUpload = undefined
},
})
function dispose() {
upload?.unmount()
releaseUpload?.()
merge.unmount()
}merge.content คือ DOM แก้ไขตรงกลาง ส่วน merge.surface และ merge.toolbar เชื่อมแล้ว อย่าสร้างพื้นผิวหรือแถบเครื่องมือซ้ำตรงนั้น ถอด mount อัปโหลดและความคืบหน้าเพิ่มเติมก่อน แล้วค่อยเรียก merge.unmount()