diff --git a/component/common/src/main/java/one/nem/lacerta/component/common/LacertaApplyTagAdapter.java b/component/common/src/main/java/one/nem/lacerta/component/common/LacertaApplyTagAdapter.java new file mode 100644 index 00000000..4e533a5a --- /dev/null +++ b/component/common/src/main/java/one/nem/lacerta/component/common/LacertaApplyTagAdapter.java @@ -0,0 +1,83 @@ +package one.nem.lacerta.component.common; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; + +import one.nem.lacerta.component.common.model.DocumentTagApplyTagDialogExtendedModel; +import one.nem.lacerta.model.document.tag.DocumentTag; + +public class LacertaApplyTagAdapter extends RecyclerView.Adapter{ + + // Listener + public interface LacertaApplyTagDialogListener { + void itemChecked(View view, String tagId); + void itemUnchecked(View view, String tagId); + } + + // Variables + private ArrayList documentTagArrayList; + private LacertaApplyTagDialogListener listener; + + // Setter + public LacertaApplyTagAdapter setListener(LacertaApplyTagDialogListener listener) { + this.listener = listener; + return this; + } + + public LacertaApplyTagAdapter setDocumentTagArrayList(ArrayList documentTagArrayList) { + this.documentTagArrayList = documentTagArrayList; + return this; + } + + // Empty constructor + public LacertaApplyTagAdapter() { + } + + @NonNull + @Override + public LacertaApplyTagAdapter.LacertaApplyTagViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.apply_tag_list_item, parent, false); + return new LacertaApplyTagAdapter.LacertaApplyTagViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull LacertaApplyTagAdapter.LacertaApplyTagViewHolder holder, int position) { + DocumentTagApplyTagDialogExtendedModel documentTag = documentTagArrayList.get(position); + if (holder.checkBox == null) { + Log.d("LacertaApplyTagAdapter", "onBindViewHolder: holder.checkBox is null"); + } + holder.checkBox.setText(documentTag.getName()); + holder.checkBox.setChecked(documentTag.getIsChecked()); + holder.checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked) { + listener.itemChecked(buttonView, documentTag.getId()); + } else { + listener.itemUnchecked(buttonView, documentTag.getId()); + } + }); + } + + @Override + public int getItemCount() { + return documentTagArrayList == null ? 0 : documentTagArrayList.size(); + } + + public class LacertaApplyTagViewHolder extends RecyclerView.ViewHolder { + + CheckBox checkBox; + + public LacertaApplyTagViewHolder(@NonNull View itemView) { + super(itemView); + + checkBox = itemView.findViewById(R.id.tag_check_box); + } + } +} diff --git a/component/common/src/main/java/one/nem/lacerta/component/common/LacertaApplyTagDialog.java b/component/common/src/main/java/one/nem/lacerta/component/common/LacertaApplyTagDialog.java new file mode 100644 index 00000000..5233528c --- /dev/null +++ b/component/common/src/main/java/one/nem/lacerta/component/common/LacertaApplyTagDialog.java @@ -0,0 +1,184 @@ +package one.nem.lacerta.component.common; + +import android.app.Dialog; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.CheckBox; +import android.widget.Checkable; +import android.widget.EditText; +import android.widget.Toast; + +import androidx.fragment.app.DialogFragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +import dagger.hilt.android.AndroidEntryPoint; +import one.nem.lacerta.component.common.model.DocumentTagApplyTagDialogExtendedModel; +import one.nem.lacerta.data.Document; +import one.nem.lacerta.data.LacertaLibrary; +import one.nem.lacerta.model.document.tag.DocumentTag; +import one.nem.lacerta.utils.LacertaLogger; + +@AndroidEntryPoint +public class LacertaApplyTagDialog extends DialogFragment { + + @Inject + LacertaLogger logger; + + @Inject + LacertaLibrary lacertaLibrary; + + // Listener + public interface LacertaApplyTagDialogListener { + void onDialogPositiveClick(ArrayList appliedTags); + void onDialogNegativeClick(); + } + + // Variables + private String title; + private String message; + private String positiveButtonText; + private String negativeButtonText; + private String documentId; + private LacertaApplyTagDialogListener listener; + private ArrayList registeredTags; + private ArrayList appliedTags; + + // Setter + + public LacertaApplyTagDialog setListener(LacertaApplyTagDialogListener listener) { + this.listener = listener; + return this; + } + + public LacertaApplyTagDialog setTitle(String title) { + this.title = title; + return this; + } + + public LacertaApplyTagDialog setMessage(String message) { + this.message = message; + return this; + } + + public LacertaApplyTagDialog setPositiveButtonText(String positiveButtonText) { + this.positiveButtonText = positiveButtonText; + return this; + } + + public LacertaApplyTagDialog setNegativeButtonText(String negativeButtonText) { + this.negativeButtonText = negativeButtonText; + return this; + } + + public LacertaApplyTagDialog setDocumentId(String documentId) { + this.documentId = documentId; + return this; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity()); + LayoutInflater inflater = requireActivity().getLayoutInflater(); + View view = inflater.inflate(R.layout.lacerta_dialog_apply_tag, null); + + // RecyclerView + RecyclerView recyclerView = view.findViewById(R.id.apply_tag_list); + + LacertaApplyTagAdapter lacertaApplyTagAdapter = new LacertaApplyTagAdapter(); + lacertaApplyTagAdapter.setListener(new LacertaApplyTagAdapter.LacertaApplyTagDialogListener() { + @Override + public void itemChecked(View view, String tagId) { + applyChangeToVariable(true, tagId); + } + + @Override + public void itemUnchecked(View view, String tagId) { + applyChangeToVariable(false, tagId); + } + }); + + recyclerView.setAdapter(lacertaApplyTagAdapter); + recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext())); + + getDocumentTagArrayList(documentId).thenAccept(documentTagArrayList -> { + lacertaApplyTagAdapter.setDocumentTagArrayList(documentTagArrayList); + lacertaApplyTagAdapter.notifyDataSetChanged(); // TODO-rca: アニメーション + }); + + // Set the dialog title + builder.setTitle(title) + .setMessage(message) + .setView(view) + .setPositiveButton(positiveButtonText == null ? "OK" : positiveButtonText, (dialog, id) -> { + // Send the positive button event back to the host activity + listener.onDialogPositiveClick(this.appliedTags); + }) + .setNegativeButton(negativeButtonText == null ? "Cancel" : negativeButtonText, (dialog, id) -> { + // Send the negative button event back to the host activity + listener.onDialogNegativeClick(); + }); + return builder.create(); + } + + private void applyChangeToVariable(boolean isChecked, String tagId) { + if (isChecked) { + this.registeredTags.stream().filter(tag -> tag.getId().equals(tagId)).findFirst().ifPresent(tag -> this.appliedTags.add(tag)); + } else { + this.appliedTags.stream().filter(tag -> tag.getId().equals(tagId)).findFirst().ifPresent(tag -> this.appliedTags.remove(tag)); + } + } + + private CompletableFuture> getDocumentTagArrayList(String documentId) { + return CompletableFuture.supplyAsync(() -> { + ArrayList documentTagArrayList = new ArrayList<>(); + setRegisteredTagList().thenRun(() -> setAppliedTagList(documentId).join()).thenAccept(Void -> { + logger.debug("getDocumentTagArrayList", "this.registeredTags.size(): " + this.registeredTags.size()); + logger.debug("getDocumentTagArrayList", "this.appliedTags.size(): " + this.appliedTags.size()); + + documentTagArrayList.addAll(this.registeredTags.stream().map(tag -> { + DocumentTagApplyTagDialogExtendedModel documentTag = new DocumentTagApplyTagDialogExtendedModel( + new DocumentTag(tag.getId(), tag.getName(), tag.getColor()), + this.appliedTags.stream().anyMatch(appliedTag -> appliedTag.getId().equals(tag.getId())) + ); + return documentTag; + }).collect(Collectors.toCollection(ArrayList::new))); + + }).join(); + return documentTagArrayList; + }); + } + + private CompletableFuture setRegisteredTagList() { + return CompletableFuture.runAsync(() -> { + this.registeredTags = new ArrayList<>(); + this.lacertaLibrary.getTagList().thenAccept(documentTagList -> { + for (int i = 0; i < documentTagList.size(); i++) { + this.registeredTags.add(new DocumentTag(documentTagList.get(i).getId(), documentTagList.get(i).getName(), documentTagList.get(i).getColor())); + } + }).join(); + }); + } + + private CompletableFuture setAppliedTagList(String documentId) { + return CompletableFuture.runAsync(() -> { + this.appliedTags = new ArrayList<>(); + this.lacertaLibrary.getAppliedTagList(documentId).thenAccept(documentTagList -> { + for (int i = 0; i < documentTagList.size(); i++) { + this.appliedTags.add(new DocumentTag(documentTagList.get(i).getId(), documentTagList.get(i).getName(), documentTagList.get(i).getColor())); + } + }).join(); + }); + } +} diff --git a/component/common/src/main/java/one/nem/lacerta/component/common/LacertaEditMetaDialog.java b/component/common/src/main/java/one/nem/lacerta/component/common/LacertaEditMetaDialog.java new file mode 100644 index 00000000..d16c019c --- /dev/null +++ b/component/common/src/main/java/one/nem/lacerta/component/common/LacertaEditMetaDialog.java @@ -0,0 +1,4 @@ +package one.nem.lacerta.component.common; + +public class LacertaEditMetaDialog { +} diff --git a/component/common/src/main/java/one/nem/lacerta/component/common/model/DocumentTagApplyTagDialogExtendedModel.java b/component/common/src/main/java/one/nem/lacerta/component/common/model/DocumentTagApplyTagDialogExtendedModel.java new file mode 100644 index 00000000..c6bf1861 --- /dev/null +++ b/component/common/src/main/java/one/nem/lacerta/component/common/model/DocumentTagApplyTagDialogExtendedModel.java @@ -0,0 +1,31 @@ +package one.nem.lacerta.component.common.model; + +import one.nem.lacerta.model.document.tag.DocumentTag; + +// TODO-rca: クラス名が長すぎ + +/** + * DocumentTagを設定するダイアログで使うための拡張モデル + * チェックボックスの状態を保持するように + */ +public class DocumentTagApplyTagDialogExtendedModel extends DocumentTag { + + private boolean isChecked; + + public DocumentTagApplyTagDialogExtendedModel(DocumentTag documentTag) { + super(documentTag.getId(), documentTag.getName(), documentTag.getColor()); + } + + public DocumentTagApplyTagDialogExtendedModel(DocumentTag documentTag, boolean isChecked) { + super(documentTag.getId(), documentTag.getName(), documentTag.getColor()); + this.isChecked = isChecked; + } + + public boolean getIsChecked() { + return isChecked; + } + + public void setIsChecked(boolean checked) { + isChecked = checked; + } +} diff --git a/component/common/src/main/res/layout/apply_tag_list_item.xml b/component/common/src/main/res/layout/apply_tag_list_item.xml new file mode 100644 index 00000000..dcf37d34 --- /dev/null +++ b/component/common/src/main/res/layout/apply_tag_list_item.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/component/common/src/main/res/layout/lacerta_dialog_apply_tag.xml b/component/common/src/main/res/layout/lacerta_dialog_apply_tag.xml new file mode 100644 index 00000000..49e79fe8 --- /dev/null +++ b/component/common/src/main/res/layout/lacerta_dialog_apply_tag.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/component/common/src/main/res/layout/lacerta_dialog_edit_meta.xml b/component/common/src/main/res/layout/lacerta_dialog_edit_meta.xml new file mode 100644 index 00000000..8d016a39 --- /dev/null +++ b/component/common/src/main/res/layout/lacerta_dialog_edit_meta.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file diff --git a/component/viewer/src/main/java/one/nem/lacerta/component/viewer/ViewerContainerFragment.java b/component/viewer/src/main/java/one/nem/lacerta/component/viewer/ViewerContainerFragment.java index 7636eb97..6152d199 100644 --- a/component/viewer/src/main/java/one/nem/lacerta/component/viewer/ViewerContainerFragment.java +++ b/component/viewer/src/main/java/one/nem/lacerta/component/viewer/ViewerContainerFragment.java @@ -19,13 +19,18 @@ import com.google.android.material.tabs.TabLayoutMediator; import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; +import java.util.ArrayList; +import java.util.stream.Collectors; + import javax.inject.Inject; import dagger.hilt.android.AndroidEntryPoint; +import one.nem.lacerta.component.common.LacertaApplyTagDialog; import one.nem.lacerta.component.common.picker.LacertaFilePickerDialog; import one.nem.lacerta.data.Document; import one.nem.lacerta.data.LacertaLibrary; import one.nem.lacerta.model.document.page.Page; +import one.nem.lacerta.model.document.tag.DocumentTag; import one.nem.lacerta.model.pref.ToxiDocumentModel; import one.nem.lacerta.utils.LacertaLogger; @@ -52,6 +57,7 @@ public class ViewerContainerFragment extends Fragment { private String documentId; private String documentName; private boolean hasCombined = false; + private ViewerViewPagerAdapter viewerViewPagerAdapter; public ViewerContainerFragment() { // Required empty public constructor @@ -102,7 +108,7 @@ public class ViewerContainerFragment extends Fragment { ViewPager2 viewPager = view.findViewById(R.id.view_pager); // Init view pager adapter - ViewerViewPagerAdapter viewerViewPagerAdapter = new ViewerViewPagerAdapter(requireActivity()); + this.viewerViewPagerAdapter = new ViewerViewPagerAdapter(requireActivity()); viewPager.setAdapter(viewerViewPagerAdapter); // Init tab layout @@ -112,22 +118,24 @@ public class ViewerContainerFragment extends Fragment { Toolbar toolbar = view.findViewById(R.id.toolbar); initToolbar(toolbar, true, documentName); - if (this.hasCombined) { + // Get document page + if (this.hasCombined) { // 結合親の場合 logger.debug("ViewerContainerFragment", "hasCombined: " + hasCombined); lacertaLibrary.getCombinedDocumentToxiList(documentId).thenAccept(combinedDocumentToxiList -> { logger.debug("ViewerContainerFragment", "combinedDocumentToxiList: " + combinedDocumentToxiList.size()); - for (ToxiDocumentModel toxiDocumentModel : combinedDocumentToxiList) { - logger.debug("ViewerContainerFragment", "titleCache: " + toxiDocumentModel.getTitleCache()); - viewerViewPagerAdapter - .addFragment(ViewerBodyFragment.newInstance(toxiDocumentModel.getChildDocumentId(), toxiDocumentModel.getTitleCache()), - toxiDocumentModel.getTitleCache()); - } + + viewerViewPagerAdapter.setFragmentTargetIdList( + combinedDocumentToxiList.stream().map(ToxiDocumentModel::getChildDocumentId).collect(Collectors.toCollection(ArrayList::new))); + viewerViewPagerAdapter.setFragmentTitleList( + combinedDocumentToxiList.stream().map(ToxiDocumentModel::getTitleCache).collect(Collectors.toCollection(ArrayList::new))); + viewerViewPagerAdapter.notifyItemRangeChanged(0, combinedDocumentToxiList.size()); }); - } else { + } else { // それ以外の場合 logger.debug("ViewerContainerFragment", "hasCombined: " + hasCombined); tabLayout.setVisibility(View.GONE); - viewerViewPagerAdapter.addFragment(ViewerBodyFragment.newInstance(documentId, documentName), documentName); + viewerViewPagerAdapter.setFragmentTargetIdList(new ArrayList(){{add(documentId);}}); // TODO-rca: 読みにくいので直接追加できるようにする + viewerViewPagerAdapter.setFragmentTitleList(new ArrayList(){{add(documentName);}}); viewerViewPagerAdapter.notifyItemRangeChanged(0, 1); } @@ -140,13 +148,54 @@ public class ViewerContainerFragment extends Fragment { ImageButton imageButton = customView.findViewById(R.id.tab_modify); imageButton.setOnClickListener(v -> { - Toast.makeText(getContext(), "Working!, Index:" + position, Toast.LENGTH_SHORT).show(); + renameCombinedDocument( + this.documentId, + viewerViewPagerAdapter.getFragmentTargetId(position), + viewerViewPagerAdapter.getFragmentTitle(position), + position); }); tab.setCustomView(customView); }).attach(); } + private void renameCombinedDocument(String parentId, String childId, String current, int position) { // TODO-rca: 無理やりpositionを渡してるのでなんとかする + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext()); + builder.setTitle("アイテム名の変更"); + builder.setMessage("アイテム名を入力してください"); + + View view = LayoutInflater.from(getContext()).inflate(one.nem.lacerta.shared.ui.R.layout.lacerta_dialog_edit_text_layout, null); + TextInputEditText textInputEditText = view.findViewById(one.nem.lacerta.shared.ui.R.id.custom_edit_text); + TextInputLayout textInputLayout = view.findViewById(one.nem.lacerta.shared.ui.R.id.custom_text_input_layout); + textInputEditText.setText(current); + textInputLayout.setHint("アイテム名"); + builder.setView(view); + + builder.setPositiveButton("変更", (dialog, which) -> { + document.renameDocument(childId, textInputEditText.getText().toString()).thenCombine( + lacertaLibrary.updateTitleCache(parentId, childId, textInputEditText.getText().toString()), (aVoid, aVoid2) -> { + getActivity().runOnUiThread(() -> { + Toast.makeText(getContext(), "変更しました", Toast.LENGTH_SHORT).show(); + updateTabTitle(position, textInputEditText.getText().toString()); + dialog.dismiss(); + }); + return null; + }); + }); + builder.setNegativeButton("キャンセル", (dialog, which) -> { + dialog.cancel(); + }); + + builder.show(); + } + + private void updateTabTitle(int position, String title) { + ArrayList fragmentTitleList = viewerViewPagerAdapter.getFragmentTitleList(); + fragmentTitleList.set(position, title); + viewerViewPagerAdapter.setFragmentTitleList(fragmentTitleList); + viewerViewPagerAdapter.notifyItemChanged(position); + } + /** * Toolbarをinitする * @@ -187,6 +236,9 @@ public class ViewerContainerFragment extends Fragment { } else if (item.getItemId() == R.id.action_combine) { combineDocument(); return true; + } else if (item.getItemId() == R.id.action_apply_tag) { + applyTag(); + return true; } else { return false; } @@ -194,6 +246,33 @@ public class ViewerContainerFragment extends Fragment { }); } + private void applyTag() { + LacertaApplyTagDialog lacertaApplyTagDialog = new LacertaApplyTagDialog(); + lacertaApplyTagDialog + .setTitle("タグの適用") + .setMessage("タグを適用するファイルを選択してください") + .setNegativeButtonText("キャンセル") + .setDocumentId(documentId) + .setListener(new LacertaApplyTagDialog.LacertaApplyTagDialogListener() { + @Override + public void onDialogPositiveClick(ArrayList appliedTags) { + logger.debug("ViewerContainerFragment", "Dialog Result: appliedTags: " + appliedTags.size()); + lacertaLibrary.applyTagListToDocument(documentId, appliedTags).thenAccept(aVoid -> { + getActivity().runOnUiThread(() -> { + Toast.makeText(getContext(), "タグを適用しました", Toast.LENGTH_SHORT).show(); + lacertaApplyTagDialog.dismiss(); + }); + }); + } + + @Override + public void onDialogNegativeClick() { + lacertaApplyTagDialog.dismiss(); + } + }) + .show(getChildFragmentManager(), "LacertaApplyTagDialog"); + } + private void combineDocument() { LacertaFilePickerDialog lacertaFilePickerDialog = new LacertaFilePickerDialog(); lacertaFilePickerDialog.setListener((fileName, selectedId) -> { diff --git a/component/viewer/src/main/java/one/nem/lacerta/component/viewer/ViewerViewPagerAdapter.java b/component/viewer/src/main/java/one/nem/lacerta/component/viewer/ViewerViewPagerAdapter.java index e3f998fe..66a6d8a9 100644 --- a/component/viewer/src/main/java/one/nem/lacerta/component/viewer/ViewerViewPagerAdapter.java +++ b/component/viewer/src/main/java/one/nem/lacerta/component/viewer/ViewerViewPagerAdapter.java @@ -13,13 +13,17 @@ import java.util.ArrayList; public class ViewerViewPagerAdapter extends FragmentStateAdapter { // Variables - private ArrayList fragmentArrayList = new ArrayList<>(); + private ArrayList fragmentTargetIdList = new ArrayList<>(); private ArrayList fragmentTitleList = new ArrayList<>(); // Setter - public void addFragment(Fragment fragment, String title){ - fragmentArrayList.add(fragment); - fragmentTitleList.add(title); + + public void setFragmentTargetIdList(ArrayList fragmentTargetIdList) { + this.fragmentTargetIdList = fragmentTargetIdList; + } + + public void setFragmentTitleList(ArrayList fragmentTitleList) { + this.fragmentTitleList = fragmentTitleList; } public ViewerViewPagerAdapter(@NonNull FragmentActivity fragmentActivity) { @@ -29,16 +33,40 @@ public class ViewerViewPagerAdapter extends FragmentStateAdapter { @NonNull @Override public Fragment createFragment(int position) { - return fragmentArrayList.get(position); + return ViewerBodyFragment.newInstance(fragmentTargetIdList.get(position), fragmentTitleList.get(position)); } @Override public int getItemCount() { - return fragmentArrayList == null ? 0 : fragmentArrayList.size(); + if (fragmentTargetIdList == null || fragmentTitleList == null) { + return 0; + } else if (fragmentTargetIdList.size() != fragmentTitleList.size()) { + throw new IllegalStateException("fragmentTargetIdList.size() != fragmentTitleList.size()"); + } else { + return fragmentTargetIdList.size(); + } } @Nullable public CharSequence getTabTitle(int position) { return fragmentTitleList.get(position); } + + // Getter + + public String getFragmentTargetId(int position) { + return fragmentTargetIdList.get(position); + } + + public String getFragmentTitle(int position) { + return fragmentTitleList.get(position); + } + + public ArrayList getFragmentTargetIdList() { + return fragmentTargetIdList; + } + + public ArrayList getFragmentTitleList() { + return fragmentTitleList; + } } diff --git a/component/viewer/src/main/res/menu/viewer_menu.xml b/component/viewer/src/main/res/menu/viewer_menu.xml index 231419b6..92dab962 100644 --- a/component/viewer/src/main/res/menu/viewer_menu.xml +++ b/component/viewer/src/main/res/menu/viewer_menu.xml @@ -20,4 +20,12 @@ android:id="@+id/action_combine" android:title="結合" /> + + + + \ No newline at end of file diff --git a/data/src/main/java/one/nem/lacerta/data/LacertaLibrary.java b/data/src/main/java/one/nem/lacerta/data/LacertaLibrary.java index 764dcb5a..e1ce346e 100644 --- a/data/src/main/java/one/nem/lacerta/data/LacertaLibrary.java +++ b/data/src/main/java/one/nem/lacerta/data/LacertaLibrary.java @@ -45,12 +45,16 @@ public interface LacertaLibrary { CompletableFuture addTagToDocument(String documentId, String tagId); + CompletableFuture applyTagListToDocument(String documentId, ArrayList tagList); + CompletableFuture removeTagFromDocument(String documentId, String tagId); // Combined Document CompletableFuture combineDocument(String parentId, String childId); + CompletableFuture updateTitleCache(String parentId, String childId, String titleCache); + CompletableFuture uncombineDocument(String parentId, String childId); // CompletableFuture combineDocument(String parentId, ArrayList childIdList); diff --git a/data/src/main/java/one/nem/lacerta/data/impl/LacertaLibraryImpl.java b/data/src/main/java/one/nem/lacerta/data/impl/LacertaLibraryImpl.java index 5c65a2af..f35dee8c 100644 --- a/data/src/main/java/one/nem/lacerta/data/impl/LacertaLibraryImpl.java +++ b/data/src/main/java/one/nem/lacerta/data/impl/LacertaLibraryImpl.java @@ -321,6 +321,20 @@ public class LacertaLibraryImpl implements LacertaLibrary { }); } + @Override + public CompletableFuture applyTagListToDocument(String documentId, ArrayList tagArrayList) { + return CompletableFuture.supplyAsync(() -> { // TODO-rca: 必要なものだけInsertするべき, 時間があれば... + // 一旦全てのタグを削除 + database.toxiDocumentTagDao().deleteByDocumentId(documentId); + logger.debug("LacertaLibraryImpl", "Database Query: Deleted ToxiDocumentTagEntity"); + // タグを追加 + for (DocumentTag documentTag : tagArrayList) { + addTagToDocument(documentId, documentTag.getId()); + } + return null; + }); + } + @Override public CompletableFuture removeTagFromDocument(String documentId, String tagId) { return CompletableFuture.supplyAsync(() -> { @@ -375,6 +389,21 @@ public class LacertaLibraryImpl implements LacertaLibrary { logger.debug("LacertaLibraryImpl", "Database Query: Inserted ToxiDocumentEntity"); } + @Override + public CompletableFuture updateTitleCache(String parentId, String documentId, String titleCache) { + return CompletableFuture.supplyAsync(() -> { + ToxiDocumentEntity toxiDocumentEntity = database.toxiDocumentDao().findByParentIdAndChildId(parentId, documentId); + if (toxiDocumentEntity == null) { + logger.warn("LacertaLibraryImpl", "ToxiDocumentEntity is not found."); + return null; + } + toxiDocumentEntity.titleCache = titleCache; + database.toxiDocumentDao().update(toxiDocumentEntity); + logger.debug("LacertaLibraryImpl", "Database Query: Updated ToxiDocumentEntity"); + return null; + }); + } + @Override public CompletableFuture uncombineDocument(String parentId, String childId) { return CompletableFuture.supplyAsync(() -> { diff --git a/source/src/main/java/one/nem/lacerta/source/database/dao/ToxiDocumentDao.java b/source/src/main/java/one/nem/lacerta/source/database/dao/ToxiDocumentDao.java index 201a5d37..05923d03 100644 --- a/source/src/main/java/one/nem/lacerta/source/database/dao/ToxiDocumentDao.java +++ b/source/src/main/java/one/nem/lacerta/source/database/dao/ToxiDocumentDao.java @@ -15,6 +15,9 @@ public interface ToxiDocumentDao { @Query("SELECT * FROM toxi_document WHERE parent_document_id = :parentId AND is_active = 1 ORDER BY `order` ASC") List findByParentId(String parentId); + @Query("SELECT * FROM toxi_document WHERE parent_document_id = :parentId AND child_document_id = :childId AND is_active = 1") + ToxiDocumentEntity findByParentIdAndChildId(String parentId, String childId); + @Insert void insert(ToxiDocumentEntity toxiDocument);